固定精度浮動小数点型、ネイティブにあなたのCPUのでサポートされているもので立ち往生浮動小数点ユニット(float
、double
、real
)は、与えられた例のように、精度の桁数を必要とする計算には最適ではありません。
問題は、これらの浮動小数点型は、そのようなデータ型で表現できる数値の長さを制限する有限の精度の桁数(実際には2進数)を持つことです。 float
タイプの制限は小数点第7位(例:3.141593)です。 double
タイプは14に制限されます(例:3.1415926535898)。 real
タイプも同様の制限があります(double
よりわずかに多い)。
浮動小数点値に非常に小さな数値を追加すると、その数字が失われます。
float a = 1.234567f, b = 0.00000000
float c = a + b;
writefln("a = %f b = %f c = %f", a, b, c);
両方a
とb
が有効な浮動小数点値であり、個々に分離して精度の約7桁を保持:私たちは一緒に、次の2つのfloat値を追加するときに何が起こるかを見ます。追加したとき、それはフロートに戻って押し込んだばかりだので、しかし、唯一の最前面の7桁の数字が保存されています
1.23456700=> 1.234567|00=> 1.234567
^^^^^^^^^^^
sent to the bit bucket
a
とb
GETの添加から精度の細かい数字がオフにフラフラのでそうc
はa
に等しいを終わります。
Here's another explanation of the conceptおそらく鉱山よりもはるかに優れています。
この問題に対する答えは任意精度の算術です。残念ながら、任意精度の算術演算のサポートはCPUハードウェアにはありません。したがって、(通常は)プログラミング言語ではありません。しかし、任意精度の浮動小数点型をサポートする多くのライブラリと、それらで実行したい数学があります。いくつかの提案については、this questionを参照してください。あなたはおそらくこの目的のためにD固有のライブラリを見つけることはできませんが、孤立して使用するのに十分なはずのCライブラリ(GMP、MPFRなど)がたくさんあります。それらのうちの1つのためのDバインディング。
素晴らしいです。私はこのように試してみましょう! – NaN