這種情況讓我很困惑:我有一個.NET應用程序正在執行浮點數計算。這似乎有問題做分裂,Math.Pow和Math.Exp。例如:在.NET中錯誤的浮點數計算
double _E1 = 20616579.5;
double sub = 19000;
double total = 19623;
double percent = sub/total; //0.96825152635574341
double _result1 = Math.Pow(_E1, percent); //12078177.0
double _result2 = Math.Exp(percent * Math.Log(_E1)); //12078184.730266357
所有三種結果,百分比,_result1和_result2是不正確的(你可以用計算器來驗證)。
我有運行相同的代碼中的另一個.NET程序,在同一臺機器上,給出了正確的結果:
- _result1 = 12078180.370260473
- _result2 = 12078180.370260468
- 百分率爲0.96825154155837534
僅通過查看百分比的結果,精度僅爲7位十進制數字。 Double通常爲16位十進制數字。
我還有一個更簡單的例子如下:
_outcome等於有些可笑號。但是當把光標放在「*」的上方時,它會顯示正確的結果。
請幫忙,在過去的幾天裏讓我瘋狂。
更新:問題解決了。 DirectX是罪魁禍首。請參閱:Can floating-point precision be thread-dependent?
的[?爲什麼不能十進制數字精確二進制表示]可能重複(HTTP ://www.stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary) –
什麼版本的.NET?我得到了完全相同的結果(對'_result1'和'_result2'的'12078180.3702605'在LinqPad中,其目標是.NET 4.x. –
@MattBurland我不認爲這是同一個問題 - 'double'有很多精度和這兩個表達式應該會導致相同的答案 –