|
1 | 1 | +++ |
2 | | -date = '2025-08-19T8:00:00+08:00' |
| 2 | +date = '2025-08-18T8:00:00+08:00' |
3 | 3 | draft = false |
4 | 4 | title = 'IEEE-754 Introduce' |
5 | | -tags = ['c'] |
| 5 | +tags = ['C'] |
6 | 6 | +++ |
7 | 7 | IEEE 754 标准数值类型及分类 |
8 | 8 |
|
@@ -33,62 +33,65 @@ value = (-1)^(sign) x mantissa x 2^(exponent) |
33 | 33 |
|
34 | 34 | ### 浮点数的分类 Categories |
35 | 35 | 以 64 精度为例 |
36 | | -| 部分 | 位数 | 描述 | |
37 | | -| :---------------------- | :- | :---------------------- | |
38 | | -| 符号位(sign) | 1 | 0 表示正数,1 表示负数 | |
39 | | -| 阶码(exponent) | 11 | 偏移量(bias)为 1023,表示数值的量级 | |
40 | | -| 尾数(fraction / mantissa) | 52 | 有效数字,不包括隐藏位 | |
| 36 | +| 部分 | 位数 | 描述 | |
| 37 | +| :------------------------ | :--- | :---------------------- | |
| 38 | +| 符号位(sign) | 1 | 0 表示正数,1 表示负数 | |
| 39 | +| 阶码(exponent) | 11 | 偏移量(bias)为 1023,表示数值的量级 | |
| 40 | +| 尾数(fraction / mantissa) | 52 | 有效数字,不包括隐藏位 | |
41 | 41 |
|
42 | 42 | 浮点数的表示公式: |
43 | 43 | ``` |
44 | 44 | value = (-1)^sign x (1 + fraction) x 2^(exponent - bias) |
45 | 45 | ``` |
46 | 46 |
|
47 | | -1. 正常数 Normalized numbers |
| 47 | +- 正常数 Normalized numbers |
48 | 48 | - 阶码 exponent: 不全为0, 也不全为1, [1, 2^11-2] |
49 | | - - 尾数 fraction: 隐含1, [0, 1 - 2^(-52)], (52位全1 位 1 - 2^(-52)) |
| 49 | + - 尾数 fraction: 隐含1, [0, 1 - 2^-52], (52位全1 位 1 - 2^-52) |
50 | 50 | ``` |
51 | | - value = (-1)^sign x (1 + fraction) x 2^(exp - 1023) |
| 51 | + value = (-1)^sign x (1 + fraction) x 2^(exponent - 1023) |
52 | 52 | ``` |
53 | 53 | 其中, `bias = 2^(exponent - 1) - 1`, 这里为 1023 |
54 | 54 |
|
55 | | - - 最大正常数: 阶码最大为 `1024*2-2 = 2046`, 尾数全为1 `1-2^(-52)`, 即 `( 1 + (1 - 2^(-52)) ) x 2^(2026-1023)` |
| 55 | + - 最大正常数: 阶码最大为 `1024*2-2 = 2046`, 尾数全为1 `1-2^-52`, 即 `( 1 + (1 - 2^-52) ) x 2^(2026-1023)` |
56 | 56 | - 最小正常数: 阶码最小位 `1`, 尾数全为0, 即 `( 1 + 0 ) x 2^(1-1023)` |
57 | 57 |
|
58 | | -2. 非正规数 Subnormal numbers / Denormalized numbers |
| 58 | +- 非正规数 Subnormal numbers / Denormalized numbers |
59 | 59 | - 阶码 exponent: 全0 |
60 | | - - 尾数 fraction: [0, 1-2^(-52)], 没有隐藏位1 |
| 60 | + - 尾数 fraction: [0, 1-2^-52], 没有隐藏位1 |
61 | 61 | ``` |
62 | | - value = (-1)^sign x (fraction) x 2^(1 - E_min) |
| 62 | + value = (-1)^sign x (fraction) x 2^(1 - bias) |
63 | 63 | ``` |
64 | | - 其中, `E_min` 定义为 最小的正常数指数 = `1 - bias = -1022` |
| 64 | + 非正规数指数紧接最小正常数, 使非正规数数值连续接近零 |
| 65 | +
|
65 | 66 | > 注意: 非正规数的指数并不是阶码减 bias 的直接结果(0−1023 = −1023), 而是约定使用最小正常数指数 `E_min = −1022`. |
66 | 67 | > 这样可以让非正规数顺接正常数, 形成连续的可表示范围, 并支持渐进下溢. |
67 | 68 |
|
68 | | - - 最大非正规数: 阶码为0, 尾数全为1, 即 `( 1 - 2^(-52) ) x 2^(-1022)` |
69 | | - - 最小非正规数: 阶码位0, 尾数最低位为1, 其他为0, 即 `( 2^(-52) x 2^(-1022) )` |
| 69 | + - 最大非正规数: 阶码为0, 尾数全为1, 即 `( 1 - 2^-52 ) x 2^(-1022)` |
| 70 | + - 最小非正规数: 阶码位0, 尾数最低位为1, 其他为0, 即 `( 2^-52 x 2^(-1022) )` |
70 | 71 |
|
71 | | -3. 零 0 |
| 72 | +- 零 0 |
72 | 73 | - 符号 sign: 0/1 正负零 |
73 | 74 | - 阶码 exponent: 0 |
74 | 75 | - 尾数 fraction: 0 |
75 | 76 |
|
76 | | -4. 无穷 infinity |
| 77 | +- 无穷 infinity |
77 | 78 | - 符号sign: 0/1 正负无穷 |
78 | 79 | - 阶码 exponent: 2047 (全1) |
79 | 80 | - 尾数 fraction: 0 |
80 | 81 |
|
81 | | -5. 非数值 NaN |
| 82 | +- 非数值 NaN |
82 | 83 | - 阶码 exponent: 2047 (全1) |
83 | 84 | - 尾数 fraction != 0 |
84 | 85 |
|
85 | 86 | 表示未定义或非法运算, 如 0/0 |
86 | 87 |
|
87 | 88 |
|
88 | | -| 类别 | 符号位 (sign) | 阶码 (exponent) | 尾数 (fraction / mantissa) | 描述 | |
89 | | -| :---------------- | :--------- | :------------ | :----------------------- | :-------------------- | |
90 | | -| 正常数 | 0 或 1 | 1\~2046 | 0\~(1 − 2^-52) | 阶码非全 0/全 1,尾数隐含最高位 1 | |
91 | | -| 非正规数 | 0 或 1 | 0 | 0\~(1 − 2^-52) | 阶码全 0,尾数非零,无隐藏位,接近 0 | |
92 | | -| ±0 | 0 或 1 | 0 | 0 | 正零或负零 | |
93 | | -| ±∞ | 0 或 1 | 2047 | 0 | 正无穷或负无穷 | |
94 | | -| NaN (qNaN / sNaN) | 0 或 1 | 2047 | 非零 | 阶码全 1,尾数非零,表示无效或未定义运算 | |
| 89 | +| 类别 (categories) | 符号位 (sign) | 阶码 (exponent) | 尾数 (fraction / mantissa) | 描述 | |
| 90 | +| :---------------- | :------------ | :-------------- | :------------------------- | :--------------------------------------- | |
| 91 | +| 正常数 | 0 或 1 | \[1, 2046] | 1.f \[1, ..., 1.1...1] 即 [1.0, 2-ε) | 阶码非全0且非全1, 尾数隐含最高位1 | |
| 92 | +| 非正规数 | 0 或 1 | 全 0 | 0.f (0, ..., 0.1...1] 即 (0, 1.0-ε] | 阶码全0, 尾数非全0, 无隐藏位1, 接近0 | |
| 93 | +| ±0 | 0 或 1 | 全 0 | 全 0 | 阶码全0, 尾数全0 | |
| 94 | +| ±∞ | 0 或 1 | 全 1 [2047] | 全 0 | 阶码全1, 尾数全0 | |
| 95 | +| NaN (qNaN / sNaN) | 0 或 1 | 全 1 [2047] | 非全 0 | 阶码全1, 尾数非全0, 表示无效或未定义运算 | |
| 96 | +
|
| 97 | +> 注意: 非正规数的阶码虽然为全0, 但是计算时约定为 1-bias = 1-1023 = -1022, 而不是像正规数那样数 exponent - bias |
0 commit comments