ICS 与 8086 复习 04:IEEE 754 浮点表示与舍入
为什么 0.1 不能被常见二进制浮点数精确存储,而 0.125 可以?为什么两个浮点数相加后,一个较小的非零量可能消失?复习浮点数时,应先掌握编码结构,再理解精度与舍入。
本篇按课件采用的 IEEE 754 binary32 和 binary64 讨论,分别对应课程环境中的 float 和 double。计算例子的舍入方式为就近舍入,恰好中点时取末位为偶数者。
符号 阶码与小数字段
| 格式 | 总位数 | 符号位 | 阶码位数 | 小数字段位数 | 指数偏置 |
|---|---|---|---|---|---|
| binary32 | 32 | 1 | 8 | 23 | 127 |
| binary64 | 64 | 1 | 11 | 52 | 1023 |
用 s 表示符号位,E 表示阶码字段的无符号值,F 表示小数字段的无符号整数值。binary32 的分类可写为:
| 条件 | 数值或类别 |
|---|---|
| 1≤E≤254 | (-1)^s × (1+F/2^23) × 2^(E-127) |
| E=0 且 F≠0 | (-1)^s × (F/2^23) × 2^-126,非规格化数 |
| E=0 且 F=0 | 正零或负零 |
| E=255 且 F=0 | 正无穷或负无穷 |
| E=255 且 F≠0 | NaN |
关键是:隐含的前导 1 只适用于规格化数。 非规格化数的前导位为 0,并使用 -126 这一指数,不能把 E=0 生硬代入规格化公式得到 -127。格式与特殊编码可核对 Oracle 的 Single Format 说明。
完整算例 将 -12.75 编成 binary32
第一步,把绝对值转为二进制:12.75=1100.11B。第二步规格化为 1.10011B×2^3。负数令 s=1,实际指数 3 加偏置 127,得到 E=130=10000010B。
小数字段去掉隐含的前导 1,只存 10011,后补零到23位:
s E 小数字段
1 10000010 10011000000000000000000
四位分组:1100 0001 0100 1100 0000 0000 0000 0000
十六进制:C14C0000H
反向解码时分开取三个字段,得到 -1.10011B×2^3=-12.75。如果问小端内存字节,从低地址起才写成 00 00 4C C1。编码位模式和内存排列属于两个步骤,不能在求阶码时就倒序。
表示范围与连续整数范围
binary32 最小正规格化数是 2^-126,最小正非零非规格化数是 2^-149,最大有限正数是 (2-2^-23)×2^127。binary64 对应的两个最小正值分别是 2^-1022 和 2^-1074。
“最大能表示的整数”和“所有整数连续精确表示到哪里”是不同问题。binary32 有24位有效二进制精度,能连续精确表示区间 [-2^24,2^24] 内的整数;比它更大的某些整数仍可表示,只是间隔开始变大。例如 2^24+2 可表示,而 2^24+1 不可精确表示。
在规格化区间 [2^e,2^(e+1)),相邻 binary32 数的间隔为 2^(e-23)。数值越大,间隔通常越大,所以不能把“有23位小数字段”理解为固定保留23位十进制小数。
舍入为什么影响算术规律
就近偶数舍入并非总是遇到被丢弃的首位 1 就加一。小于中点舍去,大于中点进位,恰好处在中点时,选择保留部分最低位为 0 的候选数。对被舍弃的后续位,要判断它们是否全零;保护位、舍入位与粘滞信息常用来完成这一判断。IEEE 算术模式说明列出了相应的舍入方向。
取 a=16777216=2^24、b=1、c=-16777216,并假定每次运算后都舍入到 binary32:
(a+b)+c:a+b 恰处两可表示数中点,舍入回 16777216;再加 c 得 0
a+(b+c):b+c = -16777215 可精确表示;再加 a 得 1
于是加法结合律在浮点运算中不保证成立。这里的两条计算路径是规定精度下的算例;具体 C 表达式还可能受到中间计算精度和编译优化选项影响。
课件中的 3.3/1.1 也应按这条思路分析:先考虑两个操作数怎样被近似存储,再算商,最后考虑赋值和整数转换。单次近似和再次舍入可能产生不同结果,不能靠十进制直觉先认定商必定精确等于 3。将精度换成 double 通常会减小误差,但不意味着每一种比较、取整结果都会按直觉变化。
特殊值与浮点运算流程
浮点加法可按“对阶、有效数加减、规格化、舍入、处理范围和特殊情况”分析。小阶操作数对齐到大阶时需要右移,微小量可能在这一步失去对结果的影响;结果非常接近零时,非规格化数提供渐进下溢范围,并非一小于 2^-126 就立即变成零。
在采用 IEEE 默认非陷阱处理的环境中,有限非零数除以零可产生带符号无穷并记录除零状态,0/0 等无效操作可产生 NaN 并记录无效状态。因此不能写成“浮点除零完全没有异常”。普通比较中,NaN 与自身也不相等;比较浮点近似值时,也不能机械使用一个适用于所有数量级的固定容差。
自测与简答
- binary32 位模式
3F800000H表示多少? - binary32 的最小正非零数与最小正规格化数各是多少?
2^24+1舍入到 binary32,在本篇舍入方式下得到多少?
简答: ① 1.0;E=127、F=0。② 2^-149 与 2^-126。③ 2^24;它处在相邻可表示数 2^24 和 2^24+2 的中点,取偶数有效数的前者。
来源定位
主要依据 2.数据的机器级表示与处理-V1.0.pptx 第59—105页的格式、范围和算例,第169—184页的浮点运算与舍入。原第98页双精度最小非规格化数的指数误写为 -1079,应为 -1074;第188页关于0.1的误差计算须区分截断与就近舍入,本文没有沿用其特定误差数值。
讨论这篇文章
关于《ICS 与 8086 复习 04:IEEE 754 浮点表示与舍入》的补充、不同意见或延伸话题,都可以留在这里。
滚动到这里时自动载入留言。