# 2.3 浮点数的表示和运算 ## 一、浮点数的表示 ### 1.1 什么是浮点数 **浮点数**: - 小数点位置可以浮动的数 - 用于表示范围很大的数 - 类似科学计数法 ### 1.2 浮点数的表示形式 **一般形式**: ``` N = (-1)^S × M × R^E ``` 其中: - S:符号位(0正1负) - M:尾数(有效数字) - R:基数(通常为2) - E:阶码(指数) **二进制浮点数**: ``` N = (-1)^S × 1.M × 2^(E - bias) ``` ### 1.3 浮点数的格式 **IEEE 754标准**: ``` | 符号位S | 阶码E | 尾数M | | 1位 | n位 | m位 | ``` **单精度浮点数(32位)**: - 符号位:1位 - 阶码:8位(偏移127) - 尾数:23位(隐含最高位1) - 偏移量(bias):127 **双精度浮点数(64位)**: - 符号位:1位 - 阶码:11位(偏移1023) - 尾数:52位(隐含最高位1) - 偏移量(bias):1023 ### 1.4 规格化浮点数 **规格化**: - 尾数最高位为1 - 形式:1.M **非规格化数**: - 用于表示接近0的数 - 阶码全0 - 尾数前导0 ### 1.5 特殊值 | 阶码 | 尾数 | 含义 | |-----|------|------| | 全0 | 全0 | ±0 | | 全0 | 非0 | 非规格化数 | | 全1 | 全0 | ±∞ | | 全1 | 非0 | NaN(Not a Number) | | 其他 | 任意 | 规格化数 | --- ## 二、IEEE 754标准详解 ### 2.1 单精度浮点数(float) **格式**: ``` | S | EEEEEEEE | MMMMMMMMMMMMMMMMMMMMMMM | | 1 | 8 | 23 | ``` **真值计算**: ``` 若 0 < E < 255: 真值 = (-1)^S × 1.M × 2^(E-127) 若 E = 0 且 M ≠ 0: 真值 = (-1)^S × 0.M × 2^(-126) 若 E = 0 且 M = 0: 真值 = ±0 若 E = 255 且 M = 0: 真值 = ±∞ 若 E = 255 且 M ≠ 0: 真值 = NaN ``` **表示范围**: - 最小正数:1.0 × 2^(-126) ≈ 1.18 × 10^(-38) - 最大正数:(2-2^(-23)) × 2^127 ≈ 3.4 × 10^38 ### 2.2 双精度浮点数(double) **格式**: ``` | S | EEEEEEEEEEE | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | | 1 | 11 | 52 | ``` **真值计算**: ``` 若 0 < E < 2047: 真值 = (-1)^S × 1.M × 2^(E-1023) ``` **表示范围**: - 最小正数:≈ 2.2 × 10^(-308) - 最大正数:≈ 1.8 × 10^308 ### 2.3 浮点数转换示例 **例1:十进制转单精度浮点数** ``` 求 -12.75 的IEEE 754单精度表示 1. 转换为二进制: -12.75 = -1100.11 2. 规格化: -1100.11 = -1.10011 × 2^3 3. 确定各部分: S = 1(负数) M = 10011000000000000000000(23位) E = 127 + 3 = 130 = 10000010 4. 结果: 1 10000010 10011000000000000000000 = C14C0000(十六进制) ``` **例2:单精度浮点数转十进制** ``` 求 0x40400000 的十进制值 1. 转换为二进制: 0 10000000 10000000000000000000000 2. 提取各部分: S = 0(正数) E = 10000000 = 128 M = 10000000000000000000000 3. 计算真值: 真值 = (-1)^0 × 1.1 × 2^(128-127) = 1.1 × 2^1 = 11(二进制) = 3(十进制) ``` --- ## 三、浮点数的运算 ### 3.1 浮点数加减运算 **步骤**: 1. **对阶**: - 小阶向大阶看齐 - 尾数右移,阶码增加 - 阶差 = |E1 - E2| 2. **尾数运算**: - 对阶后尾数相加或相减 3. **规格化**: - 结果尾数规格化 - 左规:尾数左移,阶码减 - 右规:尾数右移,阶码加 4. **舍入**: - 对尾数进行舍入处理 5. **溢出判断**: - 阶码上溢:结果溢出 - 阶码下溢:结果为0 **例子**: ``` 计算:1.101 × 2^3 + 1.001 × 2^1 1. 对阶: 阶差 = 3 - 1 = 2 小阶向大阶看齐: 1.001 × 2^1 = 0.01001 × 2^3 2. 尾数相加: 1.10100 + 0.01001 ----------- 1.11101 3. 规格化: 结果已经是规格化形式 4. 结果:1.11101 × 2^3 ``` ### 3.2 浮点数乘除运算 **乘法步骤**: 1. 阶码相加 2. 尾数相乘 3. 规格化 4. 舍入 **除法步骤**: 1. 阶码相减 2. 尾数相除 3. 规格化 4. 舍入 ### 3.3 规格化操作 **左规**: - 尾数左移,阶码减 - 直到最高位为1 **右规**: - 尾数右移,阶码加 - 当尾数溢出时 --- ## 四、舍入方法 ### 4.1 常用舍入方法 **截断法(向零舍入)**: - 直接丢弃多余位 - 简单,但误差大 **就近舍入(四舍五入)**: - 多余位最高位为1,进位 - 为0,舍去 - 最常用 **向正无穷舍入**: - 总是向上取整 **向负无穷舍入**: - 总是向下取整 ### 4.2 IEEE 754舍入模式 - **RN(Round to Nearest)**:就近舍入 - **RZ(Round toward Zero)**:向零舍入 - **RP(Round toward Plus Infinity)**:向正无穷 - **RM(Round toward Minus Infinity)**:向负无穷 --- ## 五、浮点数的精度 ### 5.1 精度问题 **有效位数**: - 单精度:24位(约7位十进制) - 双精度:53位(约16位十进制) **精度损失**: - 大数吃小数 - 相近数相减 - 累积误差 ### 5.2 避免精度问题 - 避免相近大数相减 - 避免大数和小数直接相加 - 使用更高精度 - 采用Kahan求和等算法 --- ## 六、考研重点 1. **浮点数的表示**: - 一般形式 - IEEE 754标准 - 单精度和双精度格式 2. **IEEE 754标准详解**: - 符号位、阶码、尾数 - 偏移量 - 规格化数 - 非规格化数 - 特殊值 3. **浮点数转换**: - 十进制转浮点数 - 浮点数转十进制 4. **浮点数的运算**: - 加减运算步骤 - 乘除运算步骤 - 对阶 - 规格化 5. **舍入方法** 6. **浮点数的精度问题** --- *下一节:2.4 算术逻辑单元ALU*