定点数与浮点数
定点数的表示方法
小数点固定在某个位置的数称之为定点数,定点数分为两种情况:
- 小数点在数值位之前,表示纯小数
- 小数点在数值位之后,表示纯整数
重点:特殊情况需要乘以比例因子以满足定点数保存格式
假设用n+1
位字来表示定点数x
,为了将数据进行统一处理,符号位放在最左边,并用数值0和1分别表示正号和负号。这样就得出了定点数表示的数据格式
| 符号 | 数值位(尾数) |
| —- | —– |
| Xn |Xn-1Xn-2…X1X0|
例:
数值 | 符号位 | 数值位 |
---|---|---|
0.1011 | 0 | 1011 |
-0.1011 | 1 | 1011 |
数值 | 符号位 | 数值位 |
---|---|---|
1011 | 0 | 1011 |
-1011 | 1 | 1011 |
如果x
表示纯小数,那么小数点位于符号位后面,当符号位和尾数位都是0的时候,x
绝对值最小,|x|=0,当符号位和尾数位都是1的时候,x
绝对值最大
1 | 当x为纯小数,尾数n位全为1时,x绝对值最大: |
对于不是纯小数或者不是纯整数情况,如10.01
或101.1
,则需要把小数点向前或者向后移动以满足定点数保存格式
浮点数的表示方法
因为很大程度上计算机处理的数据不是纯小数或者纯整数,并且有些时候数据范围很大,定点数难以表达,所以提出了浮点数表示法
浮点数的表示格式
对于任意浮点数的表达格式为:N = S * r^j
其中S
为尾数,r
表示基数,j
表示阶码,在计算机中的存储格式为:
1 | 阶码符号位|阶码数值位|尾数符号位|尾数数值位 |
其中尾数S
必须使用纯小数,基数r
取2
、4
、8
、16
等,阶码j
则指明了小数点在数据中的位置,例如当r=2
,二进制数N=11.0101
可以表示为:
1 | 11.0101 = 0.110101 * 2^10 |
在计算机中的存储格式为:
阶码符号位 | 阶码数值位 | 尾数符号位 | 尾数数值位 |
---|---|---|---|
0 | 10 | 0 | 110101 |
0 | 11 | 0 | 0110101 |
浮点数的表示范围
假设阶码数值为m
位,尾数数值为n
位,则阶码能够表示的最大值为:2^m - 1
,即m
位全为1,考虑到符号位,则阶码的表示范围为:[-(2^m - 1), 2^m - 1]
,同理,尾数n
全为1时候表示的最大值为:1 - 2^-n
,尾数n
除了最后一位全是0的时候能表示最小值:2^-n
,则尾数的表示范围为:[2^-n, 1 - 2^-n]
,由此可以推导出此浮点数的范围为:
1 | 最小值:-(1 - 2^-n) * 2^(2^m - 1) 尾数最小值乘以2的阶码最大值次方 |
在计算机中常见的浮点数分为单精度浮点数
、双精度浮点数
- 单精度浮点数:使用4字节、32位来表达浮点数(float)
- 双精度浮点数:使用八字节,64位来表示浮点数(double)
浮点数的规格化
在计算机中,对于浮点数的表示有着一定的要求,规定尾数使用纯小数,且尾数最高位必须是1,例如:
1 | 11.00101 = 0.1100101 * 2^10 |
举个例子,设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数13/128表示为二进制浮点数。
1 | 13/128 = 26/128 = 0 |
存储在计算机中的格式为:
|阶码符号位|阶码数值位|尾数符号位|尾数数值位|
| —— | —— | —— | —— |
| 1 | 0011 | 0 | 1101000000 |
在举个例子熟悉一下,同样的设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数-54表示为二进制浮点数。
1 | 原码为:1,110110 |
存储在计算机中的格式为:
|阶码符号位|阶码数值位|尾数符号位|尾数数值位|
| —— | —— | —— | —— |
| 0 | 0110 | 1 | 0010100000 |
说明:这里尾数数值位的原码为
1101100000
但是计算机中存储的是补码,负数的补码为原码(除了符号位)按位取反再加1
定点数与浮点数的对比
- 当定点数与浮点数相同时,浮点数表示范围更大
- 当浮点数尾数为规格化数时,浮点数的精度更高
- 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
- 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
- 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数