我已經來求知識。
我想了解浮點數。
我想弄清楚爲什麼,當我打印最大浮點數時,它不能正確打印。打印最大單精度浮點數
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
將是沒有計算錯誤的忠實代表的最大數字。我想這是有道理的。只需要一個祝福。
感謝,
「0 11111111 11111111111111111111111」是NAN。懷疑你想要「0 11111110 11111111111111111111111」 – chux 2014-12-04 16:55:32
'FLT_MAX'就是你的想法。你的'printf()'顯示了它的近似值。要查看_exactly_是「FLT_MAX」的十進制值,您需要使用不同的代碼。 – chux 2014-12-04 16:59:49
維基百科還說:「這給了6到9位重要的十進制數字的精度」,所以在日常使用中作爲一些近似值的近似值,試圖打印所有的數字,就好像它是一個特定的整數,在這個數量級有點愚蠢。以前的10〜30個整數都不能表示。有趣的是,printf顯示的是雙精度值通常有意義的數字位數 - 我的猜測是您的實現將浮點數轉換爲double值,生成一個合理的表示形式,並用0填充到所需的長度。 – 2014-12-04 17:05:57