2013-07-26 58 views
-4

考慮下面的雙打,並fmod返回正確的值?是FMOD不正確的?

double x = .090; 
    double y = .003; 
    double r = fmod(x, y); 
    // r = 0.0029999999999999949 

爲什麼r = 0?

+3

......因爲,在一般情況下,浮點數不能完全代表基數爲10分。這個問題已經在這裏回答了數百次了。 –

+2

考慮刪除標籤視覺-C++這無關視覺-C++ – UpAndAdam

回答

3

這種類型的問題可以通過閱讀題爲What Every Computer Scientist Should Know About Floating-Point Arithmetic的論文來解決。

您的機器使用浮點數的二進制表示法,該浮點數不能精確地表示有理數3/1000 = 0.003。

當然,機器可以打印近似值0.003作爲"0.003",但這是通過printf中的格式化打印代碼完成的,當它將值舍入爲給定的十進制數位數時。

浮點值的打印的十進制版本與其實際內部值之間的差異可能會給程序員或用戶不瞭解問題時產生問題。

5

因爲像大多數小數部分一樣,這些數字不能完全用二進制浮點格式表示。要查看的實際使用什麼樣的價值觀:

#include <cstdio> 

int main() { 
    printf("%.20f %.20f\n", .090, .003); 
} 

Output: 0.08999999999999999667 0.00300000000000000006 

這些小舍入誤差意味着第一個值大於第二的整數倍,因此你看到的結果略顯不足。

您可能要允許誤差小的公差:

if (r > y - some_small_value) { 
    r = 0; 
} 
+0

我意識到我張貼後,這是輸入。這是星期五,我的思想回家:)。 – jbassking