IEEE 754 浮点数

IEEE 754 浮点数

一、基础前置知识
1.名称纠正与发音
标准正确名称:IEEE 754(视频口误写成 IETF)
•发音:I triple E
•制定组织:IEEE,定义二进制浮点数算术规范
•408 考纲要求:仅掌握 IEEE754,2014 年后不再考察其他自定义浮点数格式;2009 年唯一非 754 真题仅作拓展,不用重点练习

2.浮点数诞生原因:定点数缺陷
定点数位数固定,存在两大局限:
1.大数易溢出:如千亿数值 4 字节 int 存不下,无限加长位数不现实;
2.极小小数精度丢失严重。
解决方案:借鉴十进制科学计数法,设计二进制浮点数,牺牲部分精度换取超大表示范围。

3.通用核心概念(十进制→二进制通用)
浮点数统一形式:符号×尾数×基数阶码
1.符号:决定数值正负;
2.尾数:决定数值精度,尾数位数越多精度越高;
3.基数:进制固定值,二进制基数 = 2,十进制 = 10,机器内不存储;
4.阶码:决定小数点浮动位数,控制数值表示范围;
5.规格化:统一尾数书写标准,方便存储与计算
○十进制规格化:最高非 0 数字在小数点左侧,例:9.1×10−28(禁止0.91×10−27、91×10−29)
○二进制规格化:小数点前必须唯一为 1,例:−1.1011×22

4 二进制浮点数基础转换
普通二进制小数转规格化二进制科学计数法:
例:−110.11(2)=−1.1011×22
•小数点右移 2 位,阶码真值 = 2;
•名称由来:小数点位置由阶码决定,可以 “浮动”,故称浮点数。

二、IEEE754 标准两种核心格式(考研重点:float 单精度、double 双精度)
1.位分配总表
(1)float (单精度)
总位数:32bit
符号位 S:1bit(最高位)
阶码 E:8bit
尾数 M:23bit
阶码偏移量(偏置值):127(28−1−1)
(2)double (双精度)
总位数:64bit 1bit(最高位) 11bit 52bit 1023(211−1−1)
符号位 S:1bit(最高位)
阶码 E:11bit
尾数 M:52bit
阶码偏移量(偏置值):1023(211−1−1)
(3)关键规律
偏置值通用公式:阶码位数 n,偏移量 =2n−1−1
•尾数位数决定精度:double 尾数更长,精度更高;
•阶码位数决定表示范围:double 阶码位更多,能表示更大 / 更小数字。

2.三部分存储规则(规格化浮点数,阶码不全 0、不全 1)
(1)符号位 S
1bit,规则:0 正、1 负,和原码符号规则一致。
(2)尾数 M(隐藏 1 机制,必考)
规格化尾数格式:1.M(小数点前固定 1,小数点后是 M)
•机器只存小数点后 M 部分,省略整数位的 1,不占用存储空间;
•float 实际尾数精度 24 位(23 位存储位 + 隐藏 1),double 实际 53 位;
•作用:节省 1bit,提升尾数精度。
例:二进制1.0001,机器仅存储0001,剩余低位补 0 凑满 23/52 位。
(3)阶码 E(移码存储,必考转换)
阶码真值有正有负,IEEE754 规定阶码用偏移移码存储:
1.转换步骤(真值→机器阶码)
阶码机器值 = 阶码真值 + 偏置值
结果转为对应位数无符号二进制;
2.逆转换(机器阶码→真值)
阶码真值 = 无符号解读的机器阶码 - 偏置值;
3.示例:float 阶码真值 = 2
机器阶码 = 2+127=129 → 8bit 二进制10000001

三、十进制真值 ↔ IEEE754 浮点数 两大必考题型
题型 1:十进制数 → float/double 机器二进制(真题高频)
通用四步流程(以 - 8.25 转 float 为例)
1.拆分正负,确定符号位:负数 S=1;
2.十进制整数 + 小数转二进制:−8.25=−1000.01(2)
○整数:除 2 取余;小数:乘积取整法(小数 ×2,取整数位,剩余小数循环至 0);
3.写成规格化二进制科学计数法:−1.0001×23
尾数小数部分:0001;阶码真值 = 3;
4.分别计算三部分二进制并拼接
○符号:1
○阶码:3+127=130 → 8bit 10000010
○尾数:0001 后补 0 至 23 位 0001000…000
拼接顺序:符号位 + 阶码 + 尾数 = 完整 32 位 float 机器数

题型 2:浮点数机器码(二进制 / 十六进制)→ 十进制真值
通用四步流程
1.十六进制转完整二进制,按 1 + 阶码位 + 尾数位拆分 S、E、M;
2.判断阶码状态:全 0 / 全 1 / 普通规格化;
3.分别解析符号、阶码真值、完整尾数(规格化补隐藏 1);
4.组合公式 (−1)S×(1.M)2×2阶码真值,转十进制。

四、IEEE754 浮点数分类:规格化、非规格化、特殊值
分类判断依据:阶码 E 是否全 0 / 全 1
1.规格化浮点数(日常绝大多数数值)
•判定条件:阶码 E ≠ 全 0,且 E ≠ 全 1
•尾数规则:隐藏 1,真值尾数 =1.M
•阶码规则:真值 = 无符号 (E)- 偏置值
•float 阶码机器值范围:1\254 → 阶码真值范围:-126 \ +127
•边界值(选择题考点)
a.最大规格化正数:(2−2−23)×2127,尾数全 1,阶码真值 127
b.最小规格化正数:1.0×2−126,尾数全 0,阶码真值 - 126

2.非规格化浮点数(解决下溢,填充 0 附近空隙)
•判定条件:阶码 E 全 0,尾数 M≠全 0
•尾数规则:隐藏 0,真值尾数 =0.M(不再是 1.M)
•阶码固定规则:float 阶码真值固定 =-126;double 固定 =-1022
•作用:规格化最小正数2−126之下,存储更接近 0 的极小值;
•边界值
a.最大非规格化正数:(1−2−23)×2−126
b.最小非规格化正数:2−149(23 位尾数仅最后 1 位为 1)

3.特殊值(阶码 E 全 1)
(1)无穷大 ±INF
•条件:E 全 1,尾数 M 全 0
•符号位区分正负:S=0 正无穷,S=1 负无穷
•触发场景:运算结果超出规格化最大值,上溢 Overflow,机器存无穷,程序不崩溃,置溢出标志位 OE
(2)NaN(Not a Number,非数)
•条件:E 全 1,尾数 M 不全 0
•含义:无意义运算结果,不是有效实数
•触发场景:0/0、负数开根号、∞−∞;
•区分:非 0 数 ÷0 = 无穷,不是 NaN
(3)正负 0
•条件:阶码 E 全 0,尾数 M 全 0
•仅符号位区分:S=0 正 0,S=1 负 0;逻辑上二者相等

五、溢出:上溢 Overflow / 下溢 Underflow
1.上溢(Overflow)
运算结果绝对值 > 最大规格化浮点数
•正数上溢 → 存 +∞;负数上溢 → 存 -∞;
•CPU 置溢出标志 OE,程序默认不中断,可手动捕获异常。

2.下溢(Underflow)
运算结果绝对值 < 最小规格化正数
1.区间 1:数值落在非规格化范围 → 用非规格化存储,不触发下溢异常;
2.区间 2:数值比最小非规格化数更小 → 直接存 0(机器 0),置下溢标志 UE。

六、408 真题高频考点总结
1.基础转换:十进制↔二进制小数(乘积取整法必背);
2.存储结构:32/64 位三部分位分配、隐藏 1、阶码偏移量记忆;
3.移码换算:阶码真值和机器值互转;
4.边界数值:规格化 / 非规格化最大、最小正数;
5.特殊值区分:0、无穷、NaN 的二进制特征与产生场景;
6.溢出区分:上溢、下溢的表现与硬件处理;
7.特殊题型:同一串机器码,分别解读为 int 补码 /float 浮点数,对比真值。

七、易混易错点整理
1.规格化尾数一定有隐藏 1,仅非规格化隐藏 0;
2.非规格化阶码不使用偏移公式,固定为 - 126 (float);
3.阶码全 0、尾数全 0 是 0;阶码全 0 尾数非 0 是非规格化;
4.阶码全 1 尾数全 0 是无穷,尾数非 0 是 NaN;
5.偏置值记忆:float127、double1023,公式2n−1−1;
6.浮点数溢出不会直接崩溃程序,会用特殊值标记;
7.0 除以非 0 数得无穷,0 除以 0 得 NaN,二者不要混淆。