我讀過,有些機器無法表達,例如1.1 exaclty浮點數,讓我們的代碼浮點運算
float x=0.1;
do{
x+=0.1;
printf("%f\n",x);
} while(x!=1.1);
此代碼永遠不會結束我怎樣才能使代碼完成?也許將其轉換爲雙倍或?
我讀過,有些機器無法表達,例如1.1 exaclty浮點數,讓我們的代碼浮點運算
float x=0.1;
do{
x+=0.1;
printf("%f\n",x);
} while(x!=1.1);
此代碼永遠不會結束我怎樣才能使代碼完成?也許將其轉換爲雙倍或?
在這種情況下,檢查「<」會做的伎倆:
float x=0.1;
do{
x+=0.1;
printf("%f\n",x);
} while(x<1.05);
在一般情況下,你應該測試針對「小量」。查看here瞭解更多信息。
例如,在可接受的範圍內比較。即
while (abs(x-1.1)>0.001);
雙打將有同樣的問題,只是更精確。某些語言還爲您提供了合理的類型,您可以在其中指定一個數字作爲1/10分數或固定點數據類型。
如果你想要做的代碼你說的正是像那麼你要使用類型像小數點(如果有的話),這是一臺10浮點實現,而不是基材2
延伸閱讀:http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems和http://en.wikipedia.org/wiki/Decimal_floating_point
工作在固定點,爲那種任務。
例如decimal類型可能會有所幫助。這不是所有問題的解決方案。
對於數字問題,它是常見的指定精度的埃普西隆:
bool within_epsilon(float x, float y, float e) {
if (abs(x - y) > e) {
return false
} else {
return true
}
}
您選擇會改變你的精度ε,和你可以選擇小量取決於你的浮點執行: Machine epsilon。
+1表示指向epsilon,因爲這將使人們能夠以更簡單的方式獲取這些信息 – davbryn 2010-07-30 13:30:58
您不應該在浮點數上使用相等比較。 – phkahler 2010-07-30 14:06:26
這是我最喜歡的解釋,爲什麼浮點數,任何精度或類型,不能完全表示所有實數:http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly -in-binary/1089026#1089026 – mtrw 2010-07-30 16:55:57