2010-07-30 103 views
1

我讀過,有些機器無法表達,例如1.1 exaclty浮點數,讓我們的代碼浮點運算

float x=0.1; 
do{ 

x+=0.1; 
printf("%f\n",x); 
} while(x!=1.1); 

此代碼永遠不會結束我怎樣才能使代碼完成?也許將其轉換爲雙倍或?

+0

您不應該在浮點數上使用相等比較。 – phkahler 2010-07-30 14:06:26

+0

這是我最喜歡的解釋,爲什麼浮點數,任何精度或類型,不能完全表示所有實數:http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly -in-binary/1089026#1089026 – mtrw 2010-07-30 16:55:57

回答

0

在這種情況下,檢查「<」會做的伎倆:

float x=0.1; 
do{ 

x+=0.1; 
printf("%f\n",x); 
} while(x<1.05); 

在一般情況下,你應該測試針對「小量」。查看here瞭解更多信息。

2

例如,在可接受的範圍內比較。即

while (abs(x-1.1)>0.001); 

雙打將有同樣的問題,只是更精確。某些語言還爲您提供了合理的類型,您可以在其中指定一個數字作爲1/10分數或固定點數據類型。

0

工作在固定點,爲那種任務。

例如decimal類型可能會有所幫助。這不是所有問題的解決方案。

3

對於數字問題,它是常見的指定精度的埃普西隆:

bool within_epsilon(float x, float y, float e) { 
    if (abs(x - y) > e) { 
     return false 
    } else { 
     return true 
    } 
} 

您選擇會改變你的精度ε,和你可以選擇小量取決於你的浮點執行: Machine epsilon

+0

+1表示指向epsilon,因爲這將使人們能夠以更簡單的方式獲取這些信息 – davbryn 2010-07-30 13:30:58