计算机组成原理第二章 - 定点数与浮点数
发布时间:
2025-09-14 18:06:25
更新时间:
2025-09-15 17:36:01
🕒 阅读时间:14 min read
👀 阅读量:Loading...
💡
本页面含有AI生成内容
感谢Copilot的美化排版与样式
计算机组成原理第二章 - 定点数与浮点数
📚 基础知识回顾
1. 🔄 数的进制转换
1.1 十进制转其他进制
🎯 核心方法:
📝 十进制转二进制(整数)
方法 :除 2 取余法,余数倒序排列
示例 :( 42 ) 10 → ( ? ) 2 (42)_{10} \rightarrow (?)_2 ( 42 ) 10 → ( ? ) 2
42 ÷ 2 = 21 ⋯ 0 21 ÷ 2 = 10 ⋯ 1 10 ÷ 2 = 5 ⋯ 0 5 ÷ 2 = 2 ⋯ 1 2 ÷ 2 = 1 ⋯ 0 1 ÷ 2 = 0 ⋯ 1 \begin{aligned}
42 \div 2 &= 21 \cdots 0\\
21 \div 2 &= 10 \cdots 1\\
10 \div 2 &= 5 \cdots 0\\
5 \div 2 &= 2 \cdots 1\\
2 \div 2 &= 1 \cdots 0\\
1 \div 2 &= 0 \cdots 1
\end{aligned} 42 ÷ 2 21 ÷ 2 10 ÷ 2 5 ÷ 2 2 ÷ 2 1 ÷ 2 = 21 ⋯ 0 = 10 ⋯ 1 = 5 ⋯ 0 = 2 ⋯ 1 = 1 ⋯ 0 = 0 ⋯ 1
✅ 结果: ( 42 ) 10 = ( 101010 ) 2 (42)_{10} = (101010)_2 ( 42 ) 10 = ( 101010 ) 2
📝 十进制转十六进制
示例 :( 255 ) 10 → ( ? ) 16 (255)_{10} \rightarrow (?)_{16} ( 255 ) 10 → ( ? ) 16
255 ÷ 16 = 15 ⋯ 15 ( F ) 15 ÷ 16 = 0 ⋯ 15 ( F ) \begin{aligned}
255 \div 16 &= 15 \cdots 15_{(F)}\\
15 \div 16 &= 0 \cdots 15_{(F)}
\end{aligned} 255 ÷ 16 15 ÷ 16 = 15 ⋯ 1 5 ( F ) = 0 ⋯ 1 5 ( F )
✅ 结果: ( 255 ) 10 = ( F F ) 16 (255)_{10} = (FF)_{16} ( 255 ) 10 = ( FF ) 16
1.2 其他进制转十进制
🎯 核心公式:
N = ∑ i = − m n d i × r i N = \sum_{i=-m}^{n} d_i \times r^i N = ∑ i = − m n d i × r i
其中:r r r 为基数,d i d_i d i 为各位数字,i i i 为权值
📝 示例1: ( 1011.01 ) 2 → ( ? ) 10 (1011.01)_2 \rightarrow (?)_{10} ( 1011.01 ) 2 → ( ? ) 10
= 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 + 0 × 2 − 1 + 1 × 2 − 2 = 8 + 0 + 2 + 1 + 0 + 0.25 = ( 11.25 ) 10 \begin{aligned}
&= 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2}\\
&= 8 + 0 + 2 + 1 + 0 + 0.25\\
&= (11.25)_{10}
\end{aligned} = 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 + 0 × 2 − 1 + 1 × 2 − 2 = 8 + 0 + 2 + 1 + 0 + 0.25 = ( 11.25 ) 10
📝 示例2: ( 2 A . F ) 16 → ( ? ) 10 (2A.F)_{16} \rightarrow (?)_{10} ( 2 A . F ) 16 → ( ? ) 10
= 2 × 16 1 + 10 × 16 0 + 15 × 16 − 1 = 32 + 10 + 0.9375 = ( 42.9375 ) 10 \begin{aligned}
&= 2 \times 16^1 + 10 \times 16^0 + 15 \times 16^{-1}\\
&= 32 + 10 + 0.9375\\
&= (42.9375)_{10}
\end{aligned} = 2 × 1 6 1 + 10 × 1 6 0 + 15 × 1 6 − 1 = 32 + 10 + 0.9375 = ( 42.9375 ) 10
1.3 小数转换详解
📝 示例: ( 13.625 ) 10 → ( ? ) 2 (13.625)_{10} \rightarrow (?)_2 ( 13.625 ) 10 → ( ? ) 2
整数部分: 13 10 = 1101 2 13_{10} = 1101_2 1 3 10 = 110 1 2
小数部分(乘2取整法):
0.625 × 2 = 1.25 取整: 1 0.25 × 2 = 0.5 取整: 0 0.5 × 2 = 1.0 取整: 1 \begin{aligned}
0.625 \times 2 &= 1.25 \quad \text{取整:} 1\\
0.25 \times 2 &= 0.5 \quad \text{取整:} 0\\
0.5 \times 2 &= 1.0 \quad \text{取整:} 1
\end{aligned} 0.625 × 2 0.25 × 2 0.5 × 2 = 1.25 取整: 1 = 0.5 取整: 0 = 1.0 取整: 1
✅ 结果: ( 13.625 ) 10 = ( 1101.101 ) 2 (13.625)_{10} = (1101.101)_2 ( 13.625 ) 10 = ( 1101.101 ) 2
2. 🔢 负数表示方法
2.1 原码、反码、补码对比
编码方式 正数 负数 0的表示 运算特点 原码 符号位0 + 真值 符号位1 + 真值 +0, -0两种 需要符号位单独处理 反码 与原码相同 符号位1 + 数值位取反 +0, -0两种 加法有特殊规则 补码 与原码相同 反码 + 1 唯一0 统一加减法运算
📝 示例(8位):
数值 原码 反码 补码 +5 00000101
00000101
00000101
-5 10000101
11111010
11111011
+0 00000000
00000000
00000000
-0 10000000
11111111
00000000
2.2 补码的优势
⚡ 关键优势:
零的唯一表示
加减法运算统一
硬件实现简单
表数范围最大
📝 补码范围: n n n 位补码表示范围为 [ − 2 n − 1 , 2 n − 1 − 1 ] [-2^{n-1}, 2^{n-1}-1] [ − 2 n − 1 , 2 n − 1 − 1 ]
🎯 定点数表示
1. 📖 定点数基础概念
1.1 定义与分类
🔑 定点数: 小数点位置固定的数值表示方法
类型 定义 示例 应用场景 定点整数 小数点在末尾 101 2 = 5 10 101_2 = 5_{10} 10 1 2 = 5 10 整数运算 定点小数 小数点在首位后 0.1001 2 = 0.5625 10 0.1001_2 = 0.5625_{10} 0.100 1 2 = 0.562 5 10 精密计算
💾 存储格式: 符号位(1位) + 数值位(n位)
= 总长度 n + 1 n+1 n + 1 位
1.2 关键特性对比
特性 定点数 浮点数 📊 表示范围 有限,易溢出 极大范围 🎯 精度 固定精度 动态精度 ⚡ 运算速度 快 相对较慢 🔧 硬件复杂度 简单 复杂 🔋 功耗 低 高
2. 📊 定点数表示范围
2.1 定点小数(纯小数)
📋 范围对比表:
编码类型 最大正数 最小正数 最大负数 数据范围 原码 0.111 ⋯ 1 0.111\cdots1 0.111 ⋯ 1 ( 1 − 2 − n ) (1-2^{-n}) ( 1 − 2 − n ) 0.000 ⋯ 1 0.000\cdots1 0.000 ⋯ 1 ( 2 − n ) (2^{-n}) ( 2 − n ) − 0.111 ⋯ 1 -0.111\cdots1 − 0.111 ⋯ 1 ( − 1 + 2 − n ) (-1+2^{-n}) ( − 1 + 2 − n ) − ( 1 − 2 − n ) ≤ X ≤ ( 1 − 2 − n ) -(1-2^{-n}) \leq X \leq (1-2^{-n}) − ( 1 − 2 − n ) ≤ X ≤ ( 1 − 2 − n ) 补码 0.111 ⋯ 1 0.111\cdots1 0.111 ⋯ 1 ( 1 − 2 − n ) (1-2^{-n}) ( 1 − 2 − n ) 0.000 ⋯ 1 0.000\cdots1 0.000 ⋯ 1 ( 2 − n ) (2^{-n}) ( 2 − n ) − 1.000 ⋯ 0 -1.000\cdots0 − 1.000 ⋯ 0 ( − 1 ) (-1) ( − 1 ) − 1 ≤ X ≤ ( 1 − 2 − n ) -1 \leq X \leq (1-2^{-n}) − 1 ≤ X ≤ ( 1 − 2 − n )
📝 示例(8位定点小数,n = 7 n=7 n = 7 ):
补码范围: [ − 1.0000000 , + 0.1111111 ] [-1.0000000, +0.1111111] [ − 1.0000000 , + 0.1111111 ] 即 [ − 1 , 0.9921875 ] [-1, 0.9921875] [ − 1 , 0.9921875 ]
2.2 定点整数(纯整数)
📋 范围对比表:
编码类型 最大正数 最小负数 数据范围 原码 0111 ⋯ 1 0111\cdots1 0111 ⋯ 1 ( 2 n − 1 − 1 ) (2^{n-1}-1) ( 2 n − 1 − 1 ) 1111 ⋯ 1 1111\cdots1 1111 ⋯ 1 ( − ( 2 n − 1 − 1 ) ) (-(2^{n-1}-1)) ( − ( 2 n − 1 − 1 )) − ( 2 n − 1 − 1 ) ≤ X ≤ ( 2 n − 1 − 1 ) -(2^{n-1}-1) \leq X \leq (2^{n-1}-1) − ( 2 n − 1 − 1 ) ≤ X ≤ ( 2 n − 1 − 1 ) 补码 0111 ⋯ 1 0111\cdots1 0111 ⋯ 1 ( 2 n − 1 − 1 ) (2^{n-1}-1) ( 2 n − 1 − 1 ) 1000 ⋯ 0 1000\cdots0 1000 ⋯ 0 ( − 2 n − 1 ) (-2^{n-1}) ( − 2 n − 1 ) − 2 n − 1 ≤ X ≤ ( 2 n − 1 − 1 ) -2^{n-1} \leq X \leq (2^{n-1}-1) − 2 n − 1 ≤ X ≤ ( 2 n − 1 − 1 )
📝 示例(8位定点整数,n = 7 n=7 n = 7 ):
补码范围: [ − 128 , + 127 ] [-128, +127] [ − 128 , + 127 ]
3. 🔄 数制转换详解
3.1 十进制 → 二进制定点数
🎯 定点小数转换步骤:
📝 示例: 0.625 10 → 8 0.625_{10} \rightarrow 8 0.62 5 10 → 8 位定点小数
0.625 × 2 = 1.25 取整: 1 , 余: 0.25 0.25 × 2 = 0.5 取整: 0 , 余: 0.5 0.5 × 2 = 1.0 取整: 1 , 余: 0 \begin{aligned}
0.625 \times 2 &= 1.25 \quad \text{取整:} 1, \text{余:} 0.25\\
0.25 \times 2 &= 0.5 \quad \text{取整:} 0, \text{余:} 0.5\\
0.5 \times 2 &= 1.0 \quad \text{取整:} 1, \text{余:} 0
\end{aligned} 0.625 × 2 0.25 × 2 0.5 × 2 = 1.25 取整: 1 , 余: 0.25 = 0.5 取整: 0 , 余: 0.5 = 1.0 取整: 1 , 余: 0
✅ 结果: 0.625 10 = 0.101 2 = 0 1010000 补 0.625_{10} = 0.101_2 = 0\,1010000_{\text{补}} 0.62 5 10 = 0.10 1 2 = 0 101000 0 补
🎯 定点整数转换:
📝 示例: 5 10 → 8 5_{10} \rightarrow 8 5 10 → 8 位定点整数
步骤: 5 10 = 101 2 → 0 0000101 补 5_{10} = 101_2 \rightarrow 0\,0000101_{\text{补}} 5 10 = 10 1 2 → 0 000010 1 补
3.2 二进制定点数 → 十进制
🎯 定点小数转换公式:
X = ∑ i = 1 n b i × 2 − i X = \sum_{i=1}^{n} b_i \times 2^{-i} X = ∑ i = 1 n b i × 2 − i
📝 示例: 1 0110000 补 1\,0110000_{\text{补}} 1 011000 0 补 → 十进制
步骤:
符号位为1,表示负数
数值位:0110000 0110000 0110000
按权展开:0 × 2 − 1 + 1 × 2 − 2 + 1 × 2 − 3 + 0 + ⋯ = 0.25 + 0.125 = 0.375 0 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} + 0 + \cdots = 0.25 + 0.125 = 0.375 0 × 2 − 1 + 1 × 2 − 2 + 1 × 2 − 3 + 0 + ⋯ = 0.25 + 0.125 = 0.375
补码转换:先减1得反码 1 0001111 1\,0001111 1 0001111 ,再取反得原码 1 1110000 1\,1110000 1 1110000
结果: − 0.875 -0.875 − 0.875
🎯 定点整数转换公式:
X = ∑ i = 0 n − 1 b i × 2 i X = \sum_{i=0}^{n-1} b_i \times 2^{i} X = ∑ i = 0 n − 1 b i × 2 i
3.3 编码转换规则
🔄 原码 ↔ 补码:
转换方向 正数 负数 原码→补码 不变 数值位取反+1 补码→原码 不变 减1后数值位取反
📝 示例: − 5 -5 − 5 的编码转换(8位)
原码: 1 0000101 反码: 1 1111010 补码: 1 1111011 \begin{aligned}
\text{原码:} &\quad 1\,0000101\\
\text{反码:} &\quad 1\,1111010\\
\text{补码:} &\quad 1\,1111011
\end{aligned} 原码: 反码: 补码: 1 0000101 1 1111010 1 1111011
4. ⚡ 定点数运算
4.1 补码加减法
🎯 运算规则:
[ A ± B ] 补 = [ A ] 补 ± [ B ] 补 [A \pm B]_{\text{补}} = [A]_{\text{补}} \pm [B]_{\text{补}} [ A ± B ] 补 = [ A ] 补 ± [ B ] 补
📝 示例: ( − 5 ) + 3 (-5) + 3 ( − 5 ) + 3 (8位)
− 5 : 1 1111011 + 3 : 0 0000011 和 : 1 1111110 = − 2 \begin{aligned}
-5: &\quad 1\,1111011\\
+3: &\quad 0\,0000011\\
\hline
\text{和}: &\quad 1\,1111110 = -2
\end{aligned} − 5 : + 3 : 和 : 1 1111011 0 0000011 1 1111110 = − 2
4.2 溢出检测
⚠️ 溢出判断方法:
进位标志法: V = C n − 1 ⊕ C n V = C_{n-1} \oplus C_n V = C n − 1 ⊕ C n
符号检测法: 同号相加结果异号
📝 溢出示例: 127 + 1 127 + 1 127 + 1 (8位补码)
127 : 0 1111111 + 1 : 0 0000001 和 : 1 0000000 = − 128 ❌溢出 \begin{aligned}
127: &\quad 0\,1111111\\
+1: &\quad 0\,0000001\\
\hline
\text{和}: &\quad 1\,0000000 = -128 \quad \text{❌溢出}
\end{aligned} 127 : + 1 : 和 : 0 1111111 0 0000001 1 0000000 = − 128 ❌ 溢出
检测: C 6 = 1 , C 7 = 0 ⇒ C 6 ⊕ C 7 = 1 C_6 = 1, C_7 = 0 \Rightarrow C_6 \oplus C_7 = 1 C 6 = 1 , C 7 = 0 ⇒ C 6 ⊕ C 7 = 1 → 溢出
5. 💼 定点数应用场景
应用领域 特点 典型应用 🤖 嵌入式系统 低功耗、实时性高 传感器处理、控制系统 🎵 数字信号处理 高精度、低延迟 FFT算法、数字滤波器 💰 金融计算 避免浮点误差 货币计算、利息计算 🎮 图形处理 并行计算友好 像素处理、坐标变换
🌊 浮点数表示
1. 🔬 浮点数核心概念
1.1 通用表示形式
🎯 浮点数公式:
N = ( − 1 ) S × M × R E N = (-1)^S \times M \times R^E N = ( − 1 ) S × M × R E
参数说明:
S S S :符号位 (0=正,1=负)
M M M :尾数 (有效数字)
E E E :阶码 (指数)
R R R :基数 (通常为2)
1.2 IEEE 754标准
📋 单精度(32位)格式:
字段 位数 范围 计算规则 符号位 S S S 1位 0或1 0=正数,1=负数 阶码 E E E 8位 0-255 实际指数 = E − 127 E - 127 E − 127 尾数 M M M 23位 0-8388607 实际尾数 = 1. M 1.M 1. M (规格化)
📋 双精度(64位)格式:
字段 位数 偏移量 符号位 S S S 1位 - 阶码 E E E 11位 1023 尾数 M M M 52位 -
📝 转换示例: − 0.75 10 -0.75_{10} − 0.7 5 10 → IEEE 754单精度
步骤:
− 0.75 10 = − 0.11 2 = − 1.1 2 × 2 − 1 -0.75_{10} = -0.11_2 = -1.1_2 \times 2^{-1} − 0.7 5 10 = − 0.1 1 2 = − 1. 1 2 × 2 − 1
S = 1 S = 1 S = 1 (负数)
E = 126 E = 126 E = 126 (127 − 1 127 - 1 127 − 1 )
M = 10000000000000000000000 M = 10000000000000000000000 M = 10000000000000000000000
✅ 结果: 1 01111110 10000000000000000000000
2. 📏 浮点数规格化
2.1 规格化条件
🎯 规格化要求:
1 R ≤ ∣ M ∣ < 1 (二进制: 0.5 ≤ ∣ M ∣ < 1 ) \frac{1}{R} \leq |M| < 1 \quad \text{(二进制:} 0.5 \leq |M| < 1\text{)} R 1 ≤ ∣ M ∣ < 1 (二进制: 0.5 ≤ ∣ M ∣ < 1 )
📋 补码尾数规格化形式:
数值类型 规格化形式 示例 正数 0.1 x x x ⋯ x 0.1xxx\cdots x 0.1 xxx ⋯ x 0.1101000 0.1101000 0.1101000 负数 1.0 x x x ⋯ x 1.0xxx\cdots x 1.0 xxx ⋯ x 1.0011000 1.0011000 1.0011000
2.2 规格化判断表
二进制补码 是否规格化 说明 0.0011010 × 2 0010 0.0011010 \times 2^{0010} 0.0011010 × 2 0010 ❌ 尾数首位非1 0.1101000 × 2 0000 0.1101000 \times 2^{0000} 0.1101000 × 2 0000 ✅ 满足 0.5 ≤ M < 1 0.5 \leq M < 1 0.5 ≤ M < 1 1.1100110 × 2 0010 1.1100110 \times 2^{0010} 1.1100110 × 2 0010 ❌ 负数应为1.0 x x x 1.0xxx 1.0 xxx 形式 1.0011000 × 2 0000 1.0011000 \times 2^{0000} 1.0011000 × 2 0000 ✅ 满足 − 1 ≤ M < − 0.5 -1 \leq M < -0.5 − 1 ≤ M < − 0.5
3. 📈 浮点数表示范围
3.1 IEEE 754单精度范围
数值类型 表示范围 十进制近似 最大规格化正数 ( 2 − 2 − 23 ) × 2 127 (2-2^{-23}) \times 2^{127} ( 2 − 2 − 23 ) × 2 127 ≈ 3.4 × 10 38 \approx 3.4 \times 10^{38} ≈ 3.4 × 1 0 38 最小规格化正数 1.0 × 2 − 126 1.0 \times 2^{-126} 1.0 × 2 − 126 ≈ 1.18 × 10 − 38 \approx 1.18 \times 10^{-38} ≈ 1.18 × 1 0 − 38 最大非规格化数 ( 1 − 2 − 23 ) × 2 − 126 (1-2^{-23}) \times 2^{-126} ( 1 − 2 − 23 ) × 2 − 126 ≈ 1.18 × 10 − 38 \approx 1.18 \times 10^{-38} ≈ 1.18 × 1 0 − 38 最小非规格化数 2 − 23 × 2 − 126 2^{-23} \times 2^{-126} 2 − 23 × 2 − 126 ≈ 1.4 × 10 − 45 \approx 1.4 \times 10^{-45} ≈ 1.4 × 1 0 − 45
3.2 溢出处理
情况 结果 表示 上溢 ± ∞ \pm\infty ± ∞ 阶码全1,尾数全0 下溢 非规格化数或0 阶码全0
4. 🔢 阶码与移码
4.1 移码定义
🎯 移码公式:
[ X ] 移 = 2 n + X ( − 2 n ≤ X ≤ 2 n − 1 ) [X]_{\text{移}} = 2^n + X \quad (-2^n \leq X \leq 2^n-1) [ X ] 移 = 2 n + X ( − 2 n ≤ X ≤ 2 n − 1 )
💡 移码特性:
零的移码为 10 ⋯ 0 10\cdots0 10 ⋯ 0
真值与移码单调递增
便于大小比较
4.2 移码对照表
📋 8位移码示例(n = 7 n=7 n = 7 ,偏移量=128):
真值 补码 移码 十进制值 -128 10000000
00000000
0 -127 10000001
00000001
1 -1 11111111
01111111
127 0 00000000
10000000
128 1 00000001
10000001
129 127 01111111
11111111
255
5. ⚙️ 浮点数运算
5.1 加减运算流程
graph LR
A[🔄 对阶] --> B[➕ 尾数加减]
B --> C[📏 规格化]
C --> D[🔄 舍入]
D --> E[⚠️ 溢出判断]
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
style D fill:#fff3e0
style E fill:#ffebee
5.2 运算步骤详解
🔄 步骤1:对阶(小阶向大阶看齐)
📝 示例: X = 2 3 × 0.1101 X=2^3 \times 0.1101 X = 2 3 × 0.1101 ,Y = 2 5 × 0.1010 Y=2^5 \times 0.1010 Y = 2 5 × 0.1010
阶差:5 − 3 = 2 5-3=2 5 − 3 = 2
X尾数右移2位:X ′ = 2 5 × 0.001101 X' = 2^5 \times 0.001101 X ′ = 2 5 × 0.001101
➕ 步骤2:尾数加减
[ M X ] 补 + [ M Y ] 补 = 00.001101 + 11.0110 = 11.100101 [M_X]_{\text{补}} + [M_Y]_{\text{补}} = 00.001101 + 11.0110 = 11.100101 [ M X ] 补 + [ M Y ] 补 = 00.001101 + 11.0110 = 11.100101
📏 步骤3:规格化
结果:11.100101 11.100101 11.100101 → 左规1位 → 11.001010 11.001010 11.001010 (阶码-1)
🔄 步骤4:舍入
0舍1入:11.001010 → 11.00101 11.001010 \rightarrow 11.00101 11.001010 → 11.00101
⚠️ 步骤5:溢出判断
5.3 典型运算示例
📝 题目: X = 2 7 × 29 32 X=2^7 \times \frac{29}{32} X = 2 7 × 32 29 ,Y = 2 5 × 5 8 Y=2^5 \times \frac{5}{8} Y = 2 5 × 8 5 ,求X + Y X+Y X + Y
条件: 阶码5位,尾数7位(含符号位)
解答过程:
对阶:
[ X ] 补 = 00111 00.11101 [X]_{\text{补}} = 00111\,00.11101 [ X ] 补 = 00111 00.11101
[ Y ] 补 = 00111 00.0010100 [Y]_{\text{补}} = 00111\,00.0010100 [ Y ] 补 = 00111 00.0010100
尾数运算:
00.11101 + 00.00101 = 01.00010 00.11101 + 00.00101 = 01.00010 00.11101 + 00.00101 = 01.00010 → 尾数溢出
右规处理:
尾数:00.10001 00.10001 00.10001 ,阶码+1 → 01000 00.10001 01000\,00.10001 01000 00.10001
溢出判断:
阶码01000 01000 01000 超出5位最大值01111 01111 01111 → 上溢
6. 🚨 浮点数特殊值
📋 IEEE 754特殊值编码:
阶码E 尾数M 含义 示例 全0 全0 ± 0 \pm 0 ± 0 0 00000000 000...000
全0 非全0 非规格化数 0 00000000 000...001
全1 全0 ± ∞ \pm \infty ± ∞ 0 11111111 000...000
全1 非全0 NaN 0 11111111 000...001
7. ⚠️ 浮点数运算误差
7.1 误差来源
误差类型 产生原因 影响 对阶误差 尾数右移丢失低位 精度损失 舍入误差 位数限制近似 累积误差 运算误差 多次操作叠加 结果偏差
7.2 误差控制方法
🎯 双精度运算: 提高尾数精度
📊 误差分析: 估算精度损失
🔧 特殊算法: Kahan求和等
📝 精度损失示例:
1.0 + 2 − 24 = 1.0 + 0.0000000596 ⋯ ≈ 1.0 (单精度丢失) 1.0 + 2^{-24} = 1.0 + 0.0000000596\cdots \approx 1.0 \quad \text{(单精度丢失)} 1.0 + 2 − 24 = 1.0 + 0.0000000596 ⋯ ≈ 1.0 (单精度丢失)
📝 重要公式总结
🎯 核心公式速查
类别 公式 说明 进制转换 N = ∑ i = − m n d i × r i N = \sum_{i=-m}^{n} d_i \times r^i N = ∑ i = − m n d i × r i 任意进制转十进制 浮点数 N = ( − 1 ) S × M × 2 E − 偏移量 N = (-1)^S \times M \times 2^{E-\text{偏移量}} N = ( − 1 ) S × M × 2 E − 偏移量 IEEE 754标准 补码范围 [ − 2 n − 1 , 2 n − 1 − 1 ] [-2^{n-1}, 2^{n-1}-1] [ − 2 n − 1 , 2 n − 1 − 1 ] n位补码表示范围 定点小数(原码) [ − ( 1 − 2 − n ) , ( 1 − 2 − n ) ] [-(1-2^{-n}), (1-2^{-n})] [ − ( 1 − 2 − n ) , ( 1 − 2 − n )] 原码小数范围 定点小数(补码) [ − 1 , ( 1 − 2 − n ) ] [-1, (1-2^{-n})] [ − 1 , ( 1 − 2 − n )] 补码小数范围 定点整数(补码) [ − 2 n − 1 , 2 n − 1 − 1 ] [-2^{n-1}, 2^{n-1}-1] [ − 2 n − 1 , 2 n − 1 − 1 ] 补码整数范围 溢出检测 V = C n − 1 ⊕ C n V = C_{n-1} \oplus C_n V = C n − 1 ⊕ C n 补码溢出判断 移码转换 [ X ] 移 = 2 n + X [X]_{\text{移}} = 2^n + X [ X ] 移 = 2 n + X 移码公式 规格化条件 $0.5 \leq M
🔍 重要常数
标准 偏移量 表示范围 IEEE 754单精度 127 ± 3.4 × 10 38 \pm 3.4 \times 10^{38} ± 3.4 × 1 0 38 IEEE 754双精度 1023 ± 1.8 × 10 308 \pm 1.8 \times 10^{308} ± 1.8 × 1 0 308
📚 复习要点
⭐ 重点掌握
🔄 进制转换: 熟练掌握各种进制间的转换方法
⚡ 补码运算: 理解补码的优势和运算规则
📏 定点数范围: 记住不同编码的表示范围
🌊 浮点数格式: 掌握IEEE 754标准格式
⚙️ 浮点运算: 理解五步运算流程
⚠️ 溢出检测: 掌握各种溢出判断方法
🎯 常考题型
进制转换计算
原码/反码/补码互转
定点数运算与溢出判断
IEEE 754格式转换
浮点数加减运算
特殊值识别
💡 记忆技巧
补码优势: “统一运算,唯一零值”
浮点运算: “对阶→加减→规格→舍入→溢出”
IEEE 754: “1+8+23=32位单精度,1+11+52=64位双精度”
留言评论