无需登录 数据私有 本地保存

IEEE 754浮点数剖析 - 单/双精度位级展示

17
0
0
0
快捷:
64-bit双精度 Float64
偏移量 = 1023
S 符号(1位) E 指数(11位) M 尾数(52位)
十六进制:
符号 S
指数 E (存储)
实际指数
尾数 M (52位) + 隐含位
实际存储值:
32-bit单精度 Float32
偏移量 = 127
S 符号(1位) E 指数(8位) M 尾数(23位)
十六进制:
符号 S
指数 E (存储)
实际指数
尾数 M (23位) + 隐含位
实际存储值:
详细字段对比
字段 双精度 (Float64) 单精度 (Float32)
总位数
符号位
指数位数
尾数位数
指数偏移量1023127
存储指数
实际指数
尾数(二进制)
十六进制
数值类型
常见问题 & 知识点

IEEE 754 是由电气电子工程师学会(IEEE)制定的浮点数运算技术标准,是目前几乎所有计算机系统(包括CPU、GPU和编程语言)表示浮点数的基础。它定义了浮点数的存储格式(符号位 + 指数 + 尾数)、特殊值(±∞、NaN)、舍入规则和异常处理。该标准确保了不同平台间浮点运算的一致性。 常见格式包括:单精度(32位)双精度(64位)、半精度(16位)和四精度(128位)。

特性单精度 Float32双精度 Float64
总位数3264
符号位11
指数位811
尾数位2352
指数偏移量1271023
约十进制精度~7位有效数字~15-17位有效数字
最大规约数≈3.4×10³⁸≈1.8×10³⁰⁸
最小正规约数≈1.18×10⁻³⁸≈2.23×10⁻³⁰⁸

0.1(十进制)转换为二进制是一个无限循环小数:0.00011001100110011...(循环节0011)。由于浮点数只有有限的尾数位来存储,必须截断或舍入,因此无法精确表示0.1。这就像十进制中1/3只能近似为0.333...一样。在双精度中,0.1实际存储约为0.10000000000000000555...,在单精度中约为0.10000000149011612...。这是浮点运算中累积误差的根本原因,也是金融计算通常使用定点数或十进制类型的原因。

指数偏移量用于将带符号的指数映射到无符号整数存储。对于n位指数,偏移量 = 2^(n-1) - 1。
• 单精度8位指数:偏移量 = 2^7 - 1 = 127
• 双精度11位指数:偏移量 = 2^10 - 1 = 1023
存储指数 = 实际指数 + 偏移量。例如实际指数为0时,存储为127(单精度)或1023(双精度)。偏移量的设计使得指数比较时可以直接使用无符号整数的比较逻辑,简化了硬件设计。全0指数保留给零和子规约数,全1指数保留给无穷大和NaN。

当指数位全为0且尾数非0时,表示子规约数。它们用于填充0与最小规约数之间的"下溢缺口",实现渐进下溢。子规约数的特点是:
• 实际指数固定为 1 - 偏移量(单精度-126,双精度-1022)
• 尾数的隐含位为0(而非规约数的1)
• 值 = (-1)^S × 0.M × 2^(1-bias)
例如单精度最小正子规约数约为 1.4×10⁻⁴⁵,远小于最小正规约数 1.18×10⁻³⁸。虽然子规约数的精度较低,但避免了直接下溢到零。

Infinity(无穷大):指数位全1,尾数全0。符号位=0为正无穷(+∞),符号位=1为负无穷(-∞)。由溢出、除以零等操作产生。
NaN(非数值):指数位全1,尾数非0。分为两种:
Quiet NaN (qNaN):尾数最高位=1,在运算中静默传播,不触发异常
Signaling NaN (sNaN):尾数最高位=0且尾数非0,用于触发浮点异常进行调试
大多数编程语言默认产生qNaN。NaN与任何值(包括自身)比较都返回false(NaN ≠ NaN)。

机器精度ε = 2^(-尾数位数),即1与下一个可表示的浮点数之间的差距:
• 单精度 ε ≈ 2⁻²³ ≈ 1.19×10⁻⁷(约7位十进制精度)
• 双精度 ε ≈ 2⁻⁵² ≈ 2.22×10⁻¹⁶(约15-17位十进制精度)

常见陷阱:
比较相等:不要用==比较浮点数,应使用容差(abs(a-b) < epsilon)
大数吃小数:数量级相差过大时,加法可能丢失小数(如1e16 + 1 = 1e16)
抵消误差:两个相近的数相减会丢失有效数字
累积误差:循环中进行浮点累加,误差会累积
0.1 + 0.2 ≠ 0.3:经典案例,因为0.1和0.2都无法精确表示

负零(-0)在IEEE 754中符号位为1、指数和尾数全为0。虽然-0和+0在数值比较中相等(-0 === +0为true),但它们的位表示不同。使用Object.is(-0, +0)可以区分。负零的用途:
• 保留符号信息:如-0表示一个从负方向趋近于零的值
• 1/(-0) = -∞,而1/(+0) = +∞,在复数和极限计算中有意义
• 某些数学函数依赖零的符号(如atan2)
产生负零的常见方式:-0.0、-1/Infinity、小于最小子规约数的负数下溢。