2014-12-04 173 views
3

我已經來求知識。
我想了解浮點數。
我想弄清楚爲什麼,當我打印最大浮點數時,它不能正確打印。打印最大單精度浮點數

2-(2^-23)       Exponent Bits 
1.99999988079071044921875 * (1.7014118346046923173168730371588e+38) = 
    3.4028234663852885981170418348451e+38 

這應該是最大的單精度浮點數:

340282346638528859811704183484510000000.0 

所以,

float i = 340282346638528859811704183484510000000.0; 
printf(TEXT, "Float %.38f", i); 
Output: 340282346638528860000000000000000000000.0 

顯然數目被四捨五入,所以我試圖找出只是到底發生了什麼。

我的問題是: 維基百科文檔指出,3.4028234663852885981170418348451e+38是可在IEEE-754定點中表示的最大數字。

是否存儲在浮點寄存器中的數字= 0 11111111 11111111111111111111111並且它只是不正確顯示?

如果我寫printf(TEXT, "Float %.38f", FLT_MAX);,我會得到同樣的答案。 也許我使用的計算機不使用IEEE-754?

我理解計算錯誤,但我不明白爲什麼數字 340282346638528860000000000000000000000.0是可以準確表示的最大浮點數。

也許尾數*指數引起計算錯誤?如果這是真的,那麼340282346638528860000000000000000000000.0將是沒有計算錯誤的忠實代表的最大數字。我想這是有道理的。只需要一個祝福。

感謝,

+2

「0 11111111 11111111111111111111111」是NAN。懷疑你想要「0 11111110 11111111111111111111111」 – chux 2014-12-04 16:55:32

+0

'FLT_MAX'就是你的想法。你的'printf()'顯示了它的近似值。要查看_exactly_是「FLT_MAX」的十進制值,您需要使用不同的代碼。 – chux 2014-12-04 16:59:49

+0

維基百科還說:「這給了6到9位重要的十進制數字的精度」,所以在日常使用中作爲一些近似值的近似值,試圖打印所有的數字,就好像它是一個特定的整數,在這個數量級有點愚蠢。以前的10〜30個整數都不能表示。有趣的是,printf顯示的是雙精度值通常有意義的數字位數 - 我的猜測是您的實現將浮點數轉換爲double值,生成一個合理的表示形式,並用0填充到所需的長度。 – 2014-12-04 17:05:57

回答

4

貌似罪魁禍首是printf()(我猜是因爲float隱式轉換爲double傳遞給它時):

#include <iostream> 
#include <limits> 

int main() 
{ 
    std::cout.precision(38); 
    std::cout << std::numeric_limits<float>::max() << std::endl; 
} 

輸出是:

3.4028234663852885981170418348451692544e+38 
+0

我將不得不嘗試。是的值,那麼它必須是printf()語句 – 2014-12-05 18:26:01

+0

我正在使用你的代碼的答案稍有不同34028234663852887000 ... 所以它必須與編譯器/計算機有所不同。它與printf()語句? – 2014-12-05 18:40:04

3

隨着float作爲binary32,最大的有限float

340282346638528859811704183484516925440.0

printf("%.1f", FLT_MAX)沒有義務準確地打印到38+顯著數字,所以看到這樣的下方輸出並不意外。

340282346638528860000000000000000000000.0

printf()將打印浮點精確到DECIMAL_DIG顯著數字。 DECIMAL_DIG至少 10。如果指導的意義超過DECIMAL_DIG,則兼容printf()可能會在某個時間點對結果進行舍入。 C11dr§7.21.6.16詳細說明。

+0

有趣的是,這個問題聲稱它是340282346638528859811704183484510000000.0 - 但由於問題確實尋求解釋遠遠不夠由printf顯示的精度。很好的答案。我懷疑printf()可能被允許顯示更多,甚至有義務......只是這個特定的實現選擇不......但我沒有找到一個參考。 – 2014-12-04 17:33:40

+0

@Tony D找到規範並修改了帖子。該規範有點技術性,所以我沒有引用它,但IMO,這意味着至少'DECIMAL_DIG'數字必須準確呈現。它顯示更有意義的數字,它們必須是正確的(次高或次低)。 – chux 2014-12-04 17:44:31

+0

哦酷 - 很高興知道。你完全是這個問題:-)。乾杯。 – 2014-12-04 17:47:12