版權聲明:本文爲博主原創文章,未經博主 請隨意轉載!! https://blog.csdn.net/VonSdite/article/details/76575247
結論:
- 有些編譯器 float的有效數字位是 8位 , 有些有效數字位是 7位
- 有些編譯器double的有效數字位是 15位, 有些是 16位
- 注意printf(“%f”, x); // 默認輸出6位小數(不要和有效數字混淆)
分析
-
C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算
-
無論是float還是double,在內存中的存儲主要分成三部分,分別是:
(1)符號位(Sign): 0代表正數,1代表負數 (2)指數位(Exponent): 用於存儲科學計數法中的指數部分,並且採用移位存儲方式 (3)尾數位(Mantissa): 用於存儲尾數部分
-
由圖可知:
-
float 是 32位, 其中有23位用於存放尾數, 帶有一個固定隱含位.. 所以float的有24個二進制有效位位數.
- 2^24共有8個十進制位. 所以有些編譯器 float的有效數字位是 8位 , 有些有效數字位是 7位.(注意不是小數的位數, 是有效數字位)
-
double也一樣,是64位, 其中有52位用於存放尾數, 一個固定隱含位. 共有 53個二進制有效位位數.
- 2^53次方有15個十進制位, 所以有些編譯器double的有效數字位是15位, 有些是16位