2016-06-20 8 views
1

文字列値 "15.0000000000000001"と "15"を比較する関数を記述する必要があり、MathNetを使用しています。 MathNet.Symbolics.Expression.Realを使用すると、doubleを受け入れるだけです。私はMathNet実際の倍精度問題

Expression valOne = Expression.Real(Double.Parse("15.0000000000000001")); 
Expression valTwo = Expression.Real(Double.Parse("15")); 

valOne.Equals(valTwo); 

次の操作を行う場合には、上記評価するには、小数点以下が倍増する意味であり、それは、ストレージの制限があります後、私は0のを理解15.0000000000000001リターン15をtrue.Double.Parseします。

誰でもお手伝いできますか?

+0

18桁の絶対精度が必要な場合、どのような計算や比較をしていますか? –

+0

それを見てみると、[地球上に約7.5e18の砂粒があります](http://www.npr.org/sections/krulwich/2012/09/17/161096233)です。あなたが10個の穀物でミスカウントすれば本当に問題になりますか? –

答えて

2

経験則として、Floatは連続する14桁の数字と10の累乗を保持できます。それは12.3456789を1.23456789として保存し、パワーは1になります:2つの数字を一緒にして、保存した番号を取得します。

例では、最初の1から最後の1までの18桁のスパンがあります。フロートはそれを最下位ビット(この場合は最終1)を削除するように使用可能な領域に格納できません。あなたの例の2つの数字は一致するはずです。

しかし、12.3456789と12.3456789を比較した場合、等しくはありません。

私が言及する14桁の数字は経験則であることに注意してください。これらの桁の値によっては、それよりも小さいかもしれません。

はい:これは、浮動小数点数が正確ではないことを意味します。これは近似値です。