IEEE 754 标准
IEEE 754 是由国际电气与电子工程师协会(IEEE)制定的浮点数运算和表示标准,是目前几乎所有现代计算机系统采用的浮点数格式。该标准定义了浮点数的二进制存储格式、算术运算规则、舍入模式、异常处理等内容。标准中最常用的两种格式是单精度(32 位)和双精度(64 位)。IEEE 754 标准于 1985 年首次发布,此后经历了多次修订(最新版本为 IEEE 754-2019),但基本的存储格式保持不变。
单精度(Single Precision)
单精度是 IEEE 754 定义的 32 位浮点数格式,由三个部分组成:1 位符号位(S)、8 位指数位(E)和 23 位尾数位(M)。指数偏移量(Bias)为 127,表示的实际指数为 E-127。单精度浮点数可以表示的数值范围约为 ±1.18×10^-38 到 ±3.4×10^38,有效数字约为 7 位十进制数字。单精度适用于对存储空间和精度要求不高的场景,如图形渲染、音频处理等。
双精度(Double Precision)
双精度是 IEEE 754 定义的 64 位浮点数格式,由三个部分组成:1 位符号位(S)、11 位指数位(E)和 52 位尾数位(M)。指数偏移量为 1023,表示的实际指数为 E-1023。双精度浮点数可以表示的数值范围约为 ±2.23×10^-308 到 ±1.80×10^308,有效数字约为 15-16 位十进制数字。双精度适用于需要高精度计算的场景,如科学计算、金融分析等。在大多数编程语言中,float 类型对应单精度,double 类型对应双精度。
符号位(Sign Bit)
符号位是浮点数二进制表示的最高位(第 31 位或第 63 位),用于表示数值的正负号。符号位为 0 表示正数,为 1 表示负数。符号位的引入使得零有两种表示:+0(符号位为 0,其余所有位为 0)和 -0(符号位为 1,其余所有位为 0)。在大多数算术运算中,+0 和 -0 被视为相等,但在某些特殊情况下(如除以零)会有不同的行为。
指数位(Exponent Bits)
指数位位于符号位之后,用于表示浮点数的指数部分。单精度有 8 位指数位,双精度有 11 位指数位。指数位采用偏移码(Excess-Bias)表示法,即实际指数值等于存储的无符号整数值减去偏移量(Bias)。单精度偏移量为 127,双精度偏移量为 1023。指数位全 0 和全 1 是保留值,分别用于表示非规格化数/零和特殊值(无穷大、NaN)。
尾数位(Mantissa/Fraction Bits)
尾数位也称为小数位或分数位,位于指数位之后,用于表示浮点数的精度部分。单精度有 23 位尾数位,双精度有 52 位尾数位。对于规格化数,尾数位隐含一个前导 1(即实际尾数为 1.M),这个隐含的 1 不占用存储空间,称为"隐藏位"或"隐含位"。尾数位决定了浮点数的精度——位数越多,精度越高。例如,单精度的 23 位尾数可以表示约 7 位有效十进制数字,而双精度的 52 位尾数可以表示约 15-16 位。
指数偏移(Exponent Bias)
指数偏移是 IEEE 754 中用于存储指数值的一种编码方式。由于指数需要表示正数和负数,但存储时使用无符号整数,因此引入了偏移量。实际指数值 = 存储的无符号指数值 - 偏移量。单精度偏移量为 127,双精度偏移量为 1023。例如,单精度中存储的指数值 127 表示实际指数 0(127-127=0),存储值 128 表示实际指数 1(128-127=1),存储值 126 表示实际指数 -1(126-127=-1)。偏移码的优点是比较指数大小时无需处理符号位,可以直接作为无符号整数比较。
规格化数与非规格化数
规格化数是指指数位既不全为 0 也不全为 1 的浮点数,其尾数隐含前导 1(即实际尾数为 1.M)。规格化数提供了最高的精度和合理的数值范围。非规格化数(也称为非规格化浮点数或次正规数)是指指数位全为 0 的浮点数,其尾数隐含前导 0(即实际尾数为 0.M),指数固定为 1-Bias。非规格化数用于表示非常接近零的数值,填补了规格化数与零之间的"下溢空隙"。当尾数也全为 0 时,表示正零或负零。
Infinity(无穷大)
当指数位全为 1 且尾数位全为 0 时,表示无穷大(Infinity)。符号位为 0 时表示正无穷大(+Infinity),符号位为 1 时表示负无穷大(-Infinity)。无穷大在浮点数运算中用于表示溢出结果,例如当计算结果超出浮点数能表示的最大有限数时,结果为正无穷大或负无穷大。无穷大参与的算术运算遵循特殊规则:任何数加无穷大为无穷大、任何数除以无穷大为零、无穷大乘以无穷大为无穷大等。
NaN(Not a Number)
当指数位全为 1 且尾数位不全为 0 时,表示 NaN(非数字)。NaN 用于表示未定义或不可表示的运算结果,例如 0/0、sqrt(-1)、Infinity - Infinity 等。NaN 有一个重要特性:NaN 不等于任何值,包括它自身(即 NaN != NaN 为真)。IEEE 754 定义了两种 NaN:安静 NaN(Quiet NaN,尾数最高位为 1)和信号 NaN(Signaling NaN,尾数最高位为 0)。在大多数实现中,运算结果为安静 NaN。
大端序与小端序内存存储
浮点数在内存中的字节排列遵循系统的字节序规则。大端序(Big-Endian)将最高有效字节存储在最低内存地址,即符号位在最前面,字节排列与人类阅读顺序一致。小端序(Little-Endian)将最低有效字节存储在最低内存地址,即尾数位的低字节在最前面,字节排列与人类阅读顺序相反。x86/x64 处理器默认使用小端序,网络传输使用大端序。了解浮点数的内存存储方式对于调试底层程序和解析二进制文件非常重要。
UD5工具箱