問題:IEEE 754 單精度(32 位)float,有效數字 6~7 位十進制,為何最大值約 3.4028235e38 而非 9.99999e38?
Float 佈局:1 位符號 | 8 位指數 (bias=127) | 23 位尾數 (隱含最高位 1)
254 (0xFE) → 實際指數 254-127 = 127。1.111...1 (23 個 1) ≈ 2 - 2⁻²³。(2 - 2⁻²³) × 2¹²⁷ = 2¹²⁸ - 2¹⁰⁴ ≈ 3.4028235 × 10³⁸。9.99999e38 是十進制直覺:6 位有效數字全為 9,指數 38。但 float 儲存的是二進制科學記數法:1.尾數 × 2^指數。指數 127 對應十進制約 38(2¹²⁷ ≈ 1.7e38),乘以尾數最大值 ≈2 得 ≈3.4e38。
| 項目 | 十進制直覺 | IEEE 754 二進制實際 |
|---|---|---|
| 指數位數 | 10 的冪次 | 2 的冪次 (bias=127) |
| 最大指數值 | 38 | 127 (存儲 254) |
| 尾數最大值 | 0.999999 | 1.111...1₂ ≈ 1.9999999 |
| 最終數量級 | 10³⁸ | 2¹²⁸ ≈ 3.4×10³⁸ |
#include <stdio.h>
#include <float.h>
int main() {
printf("FLT_MAX = %e\n", FLT_MAX); // 3.402823e+38
printf("FLT_MAX_EXP = %d\n", FLT_MAX_EXP); // 128 (2^127)
printf("FLT_MANT_DIG = %d\n", FLT_MANT_DIG); // 24 (含隱含位)
return 0;
}
結論:浮點數範圍由二進制指數決定,十進制有效位數僅描述精度,不決定範圍上限。