2013-07-05 75 views
5
#include <iostream> 
using namespace std; 

int main() 
{ 
    cout.precision(32); 

    float val = 268433072; 
    float add = 13.5; 

    cout << "result =" << (val + add) << endl; 
} 

我編譯上述程序與標準g++ main.cc
並用./a.out怪異c + +浮動錯誤

但是我接收,是在輸出中運行它,
result =268433088

顯然,這是不是正確的答案。這是什麼情況?

編輯:在場所使用double時的float

+9

您可能想閱讀[每位計算機科學家應該瞭解的浮點算術知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 –

+0

關於浮點問題的另一個很好的解讀:http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary – mtrw

+3

你期望什麼行爲呢? (我的意思是,從你嘗試使用'float'和'double'的事實,你顯然意識到'float'的精確度有限......) – ruakh

回答

8

您可以複製你的「浮動蟲」以更爲簡單的一段代碼

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout.precision(32); 
    float val = 2684330722; 
    cout << "result =" << val << endl; 
} 

輸出這不會發生

result =2684330752 

正如你所看到的輸出不匹配的值val是initializ編輯。

正如多次說明的那樣,浮點類型的精度有限。您的代碼示例簡單地超過了該精度,因此結果四捨五入。這裏沒有「bug」。

+0

誰低估了這個,爲什麼? – Borgleader

1

除了引用(1991, PDF) What Every Computer Scientist Should Know About Floating-Point Arithmetic

簡短的回答是,因爲浮動有限的存儲(像其他元太)的工程師們不得不做出選擇:儲存該數字與精確。對於浮點格式,他們決定精確地存儲數量爲的小數量級(十進制數字),但大數量的很不精確,實際上以+ -16,777,217開始,可表示的數字變得如此之細以至於甚至不能所有整數都代表這是您注意到的事情。