文章目录
一、数值表示的底层需求
计算机存储和运算的所有数据最终都是二进制形式。但如何表示实数(即带小数点的数)?这需要解决两个核心问题:
范围:能表示的数值范围有多大?
精度:数值的最小间隔是多少?
定点数和浮点数是两种不同的解决方案。
二、定点数(Fixed-Point Number)
1. 定义
核心特征:小数点的位置在存储时是固定不变的。
示例:假设用8位二进制表示一个数,若小数点固定在中间(即第4位后),则:
二进制 0011 1100 表示 0011.1100,即十进制 3.75。
2. 存储结构
通常分为 整数部分 和 小数部分,总位数固定。
Q格式表示法:广泛用于嵌入式系统,格式为 Qm.n:
m:整数部分位数
n:小数部分位数
总位数 = m + n + 1(符号位)
示例:Q7.8 表示符号位1位,整数7位,小数8位(共16位)。
3. 运算规则
加减法:直接对齐小数点后按整数运算。
乘法:结果的小数位数是乘数小数位数之和,需移位调整。
例如 Q3.5 × Q4.4 → 结果需右移 5+4=9 位得到正确小数位。
除法:复杂,需通过移位和迭代算法实现。
4. 优缺点
优点:
硬件实现简单,运算速度快。
精度固定,适合对确定性要求高的场景(如财务计算)。
缺点:
动态范围有限,无法同时表示极大和极小的数。
需预先确定小数点位置,灵活性差。
5. 应用场景
嵌入式系统(资源有限,无需浮点运算单元)
数字信号处理(DSP)
金融交易(避免浮点精度误差)
三、浮点数(Floating-Point Number)
1. 定义
核心特征:小数点位置可以“浮动”,通过指数动态调整数值范围。
科学计数法的二进制版本:
数值 = 符号 × 尾数 × 2指数
例如:-1.1011 × 25 → 十进制 −54.0
对于二进制数-1.1011 × 25 转换为十进制数,具体步骤如下:计算 25的值:\ 25=2×2×2×2×2=32。将二进制小数1.1011转换为十进制小数:根据二进制转十进制的 “按权相加” 法,从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。即1×2−1+0×2−2+1×2−3+1×2−4=0.5+0+0.125+0.0625=0.6875,所以1.1011转换为十进制是1+0.6875=1.6875。
计算最终结果:因为符号为负,所以最终结果为−(1.6875×32)=−54.0。
2. 存储结构(以IEEE 754标准为例)
单精度(32位):
符号位(1位) + 指数(8位,偏移127) + 尾数(23位,隐含前导1)
双精度(64位):
符号位(1位) + 指数(11位,偏移1023) + 尾数(52位,隐含前导1)
IEEE 754 单精度示例
根据IEEE 754标准,数值 -6.25 的单精度(32位)和双精度(64位)二进制表示如下:
单精度(32位)表示
步骤解析:
-
符号位:负数 → 1。