💾 浮点数转换
IEEE 754 单精度 · 双精度 · 二进制表示
IEEE 754 单精度 · 双精度 · 二进制表示
IEEE 754是浮点数运算的国际标准。单精度(32位):1位符号+8位指数+23位尾数。双精度(64位):1位符号+11位指数+52位尾数。几乎所有编程语言和CPU都遵循此标准。
因为0.1和0.2在二进制中都是无限循环小数,存储时被截断,导致微小误差。0.1+0.2≈0.30000000000000004。这是浮点数设计的固有限制。
单精度:约±1.18×10⁻³⁸ ~ ±3.4×10³⁸。双精度:约±2.23×10⁻³⁰⁸ ~ ±1.80×10³⁰⁸。超出范围会溢出为±∞,太小的数会下溢为0。
IEEE 754(1985年发布,2008年修订)是浮点数运算的国际标准,现代所有CPU和编程语言都遵循此标准。浮点数用类似科学记数法的方式表示:value = (-1)^s × (1 + fraction) × 2^(exponent - bias)
| 参数 | 半精度(16位) | 单精度(32位) | 双精度(64位) | 扩展双精度(80位) |
|---|---|---|---|---|
| 符号位 | 1 | 1 | 1 | 1 |
| 指数位 | 5 | 8 | 11 | 15 |
| 尾数位 | 10 | 23 | 52 | 64 |
| 指数偏置 | 15 | 127 | 1023 | 16383 |
| 最大正规值 | 65504 | ≈3.4×10³⁸ | ≈1.80×10³⁰⁸ | ≈1.19×10⁴⁹³² |
| 最小正规正值 | ≈6.1×10⁻⁵ | ≈1.18×10⁻³⁸ | ≈2.23×10⁻³⁰⁸ | ≈3.36×10⁻⁴⁹³² |
| 最小非规格正值 | ≈5.96×10⁻⁸ | ≈1.4×10⁻⁴⁵ | ≈4.94×10⁻³²⁴ | ≈3.65×10⁻⁴⁹⁵¹ |
| 十进制精度 | ≈3位 | ≈7位 | ≈16位 | ≈19位 |
| GPU/AI常用 | 是(bfloat16更常用) | 否 | 否 | 否 |
浮点数精度问题是编程中的经典陷阱,根本原因是用有限的二进制位表示无限精度的十进制数:
IEEE 754定义了多种特殊值来处理边界情况:
随着AI和深度学习的发展,低精度浮点格式变得越来越重要:
| 值 | 符号位 | 指数 | 尾数 | 说明 |
|---|---|---|---|---|
| +0 | 0 | 全0 | 全0 | 正零 |
| -0 | 1 | 全0 | 全0 | 负零(除法和log中与+0不同) |
| +∞ | 0 | 全1 | 全0 | 正无穷(如 1/0) |
| -∞ | 1 | 全1 | 全0 | 负无穷(如 -1/0) |
| NaN | 任意 | 全1 | 非0 | 非数(如 0/0 或 sqrt(-1)) |
| 最小非规格正数 | 0 | 全0 | ...0001 | 逐渐下溢(gradual underflow) |
| 最小正规正数 | 0 | 00...01 | 全0 | 2^(-126) 单精度 / 2^(-1022) 双精度 |
| 最大正规值 | 0 | 11...10 | 全1 | 约 3.4×10³⁸ 单精度 / 1.80×10³⁰⁸ 双精度 |
| 十进制值 | 单精度十六进制 | 双精度十六进制 | 误差 |
|---|---|---|---|
| 0 | 0x00000000 | 0x0000000000000000 | 精确 |
| 1 | 0x3F800000 | 0x3FF0000000000000 | 精确 |
| 0.5 | 0x3F000000 | 0x3FE0000000000000 | 精确(2的负幂) |
| 0.25 | 0x3E800000 | 0x3FD0000000000000 | 精确(2的负幂) |
| 0.1 | 0x3DCCCCCD | 0x3FB999999999999A | ≈1.49×10⁻⁹ |
| 0.2 | 0x3E4CCCCD | 0x3FC999999999999A | ≈2.98×10⁻⁹ |
| 3.14 | 0x4048F5C3 | 0x40091EB851EB851F | ≈1.05×10⁻⁷ |
| 16777216 | 0x4B800000 | 0x4160000000000000 | 精确(2²⁴,单精度整数极限) |
1. 输入十进制小数(如3.14或0.1)。
2. 查看IEEE 754单精度(32位)和双精度(64位)的二进制表示。
3. 可看到符号位、指数、尾数以及十六进制值。