IEEE 754 标准数值类型及分类
整数 Integer
整数是没有小数部分的值, 在计算机内通常有两种表示方式:
- 有符号整数: 可以表示正数和负数, 最常用的是二补码表示. 例如 8 位二进制的范围为[-2^7, 2^7-1]
- 无符号整数: 仅表示非负数, 8 位二进制的范围为 [0, 2^8-1]
其中补码(Two’s Complement)用于表示负数
- 正数补码与原码相同
- 负数的补码 = 该数绝对值的二进制取反 + 1
通过补码, 可以使得加减运算统一, 溢出检测更加简单
浮点数 Floating-point
浮点数用于表示带小数的实数, 尤其适合科学计算和近似表示很大或很小的数值. IEEE 754 定义了浮点数的标准格式, 类似科学计数法:
PLAINTEXT
value = (-1)^(sign) x mantissa x 2^(exponent)
浮点数由三部分组成:
- 符号位 sign: 0/1代表正负
- 阶码 exponent: 通常使用偏移表示法
- 尾数 fraction/mantissa: 小数部分
常见浮点数类型:
- 单精度 float32: 1 位符号 + 8 位阶码 + 23 位尾数
- 双精度 float64: 1 位符号 + 11 位阶码 + 52 位尾数
浮点数的分类 Categories
以 64 精度为例
部分 | 位数 | 描述 |
---|---|---|
符号位(sign) | 1 | 0 表示正数,1 表示负数 |
阶码(exponent) | 11 | 偏移量(bias)为 1023,表示数值的量级 |
尾数(fraction / mantissa) | 52 | 有效数字,不包括隐藏位 |
浮点数的表示公式:
PLAINTEXT
value = (-1)^sign x (1 + fraction) x 2^(exponent - bias)
正常数 Normalized numbers
- 阶码 exponent: 不全为0, 也不全为1, [1, 2^11-2]
- 尾数 fraction: 隐含1, [0, 1 - 2^-52], (52位全1 位 1 - 2^-52)
PLAINTEXTvalue = (-1)^sign x (1 + fraction) x 2^(exponent - 1023)
其中,
bias = 2^(exponent - 1) - 1
, 这里为 1023- 最大正常数: 阶码最大为
1024*2-2 = 2046
, 尾数全为11-2^-52
, 即( 1 + (1 - 2^-52) ) x 2^(2026-1023)
- 最小正常数: 阶码最小位
1
, 尾数全为0, 即( 1 + 0 ) x 2^(1-1023)
非正规数 Subnormal numbers / Denormalized numbers
- 阶码 exponent: 全0
- 尾数 fraction: [0, 1-2^-52], 没有隐藏位1
PLAINTEXTvalue = (-1)^sign x (fraction) x 2^(1 - bias)
非正规数指数紧接最小正常数, 使非正规数数值连续接近零
注意: 非正规数的指数并不是阶码减 bias 的直接结果(0−1023 = −1023), 而是约定使用最小正常数指数
E_min = −1022
. 这样可以让非正规数顺接正常数, 形成连续的可表示范围, 并支持渐进下溢.- 最大非正规数: 阶码为0, 尾数全为1, 即
( 1 - 2^-52 ) x 2^(-1022)
- 最小非正规数: 阶码位0, 尾数最低位为1, 其他为0, 即
( 2^-52 x 2^(-1022) )
零 0
- 符号 sign: 0/1 正负零
- 阶码 exponent: 0
- 尾数 fraction: 0
无穷 infinity
- 符号sign: 0/1 正负无穷
- 阶码 exponent: 2047 (全1)
- 尾数 fraction: 0
非数值 NaN
- 阶码 exponent: 2047 (全1)
- 尾数 fraction != 0
表示未定义或非法运算, 如 0/0
类别 (categories) | 符号位 (sign) | 阶码 (exponent) | 尾数 (fraction / mantissa) | 描述 |
---|---|---|---|---|
正常数 | 0 或 1 | [1, 2046] | 1.f 范围: [1.0, 2-ε) | 阶码非全0且非全1, 尾数隐含最高位1 |
非正规数 | 0 或 1 | 全 0 | 0.f 范围: (0, 1.0-ε] | 阶码全0, 尾数非全0, 无隐藏位1, 接近0 |
±0 | 0 或 1 | 全 0 | 全 0 | 阶码全0, 尾数全0 |
±∞ | 0 或 1 | 全 1 [2047] | 全 0 | 阶码全1, 尾数全0 |
NaN (qNaN / sNaN) | 0 或 1 | 全 1 [2047] | 非全 0 | 阶码全1, 尾数非全0, 表示无效或未定义运算 |
注意: 非正规数的阶码虽然为全0, 但是计算时约定为 1-bias = 1-1023 = -1022, 而不是像正规数那样 exponent - bias