定点数与浮点数

image-20220119165839638

定点数的表示方法

小数点固定在某个位置的数称之为定点数,定点数分为两种情况:

  1. 小数点在数值位之前,表示纯小数
  2. 小数点在数值位之后,表示纯整数

重点:特殊情况需要乘以比例因子以满足定点数保存格式
假设用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
2
3
4
5
当x为纯小数,尾数n位全为1时,x绝对值最大:
2^-1 + 2^-2 + 2^-3 + 2^n = 1 - 2^-n

当x为纯整数,尾数n位全为1时,x绝对值最大:
2^0 + 2^1 + 2^2 + 2^3 + 2^n = 2^n - 1

对于不是纯小数或者不是纯整数情况,如10.01101.1,则需要把小数点向前或者向后移动以满足定点数保存格式

浮点数的表示方法

因为很大程度上计算机处理的数据不是纯小数或者纯整数,并且有些时候数据范围很大,定点数难以表达,所以提出了浮点数表示法

浮点数的表示格式

对于任意浮点数的表达格式为:N = S * r^j其中S为尾数,r表示基数,j表示阶码,在计算机中的存储格式为:

1
阶码符号位|阶码数值位|尾数符号位|尾数数值位

其中尾数S必须使用纯小数,基数r24816等,阶码j则指明了小数点在数据中的位置,例如当r=2,二进制数N=11.0101可以表示为:

1
2
3
4
5
6
11.0101 = 0.110101 * 2^10
|
阶码,二进制表示 小数点应该在第二位
11.0101 = 0.0110101 * 2^11
|
阶码,二进制表示 小数点应该在第三位

在计算机中的存储格式为:

阶码符号位 阶码数值位 尾数符号位 尾数数值位
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
2
最小值:-(1 - 2^-n) * 2^(2^m - 1)  尾数最小值乘以2的阶码最大值次方
最大值: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
2
3
4
5
6
7
8
9
10
13/128 = 26/128 = 0
13/64 = 26/64 = 0
13/32 = 26/32 = 0
13/16 = 1+5/8 = 1
5/8 = 1+1/4 = 1
1/4 = 1/2 = 0
1/2 = 1

即13/128的原码=反码=补码 = 0.0001101000
浮点数规格化:0.1101000 * 2^-11

存储在计算机中的格式为:
|阶码符号位|阶码数值位|尾数符号位|尾数数值位|
| —— | —— | —— | —— |
| 1 | 0011 | 0 | 1101000000 |

在举个例子熟悉一下,同样的设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数-54表示为二进制浮点数。

1
2
3
4
原码为:1,110110
|
符号位
浮点数规格化为:-0.110110 * 2^110

存储在计算机中的格式为:
|阶码符号位|阶码数值位|尾数符号位|尾数数值位|
| —— | —— | —— | —— |
| 0 | 0110 | 1 | 0010100000 |

说明:这里尾数数值位的原码为1101100000 但是计算机中存储的是补码,负数的补码为原码(除了符号位)按位取反再加1

定点数与浮点数的对比

  • 当定点数与浮点数相同时,浮点数表示范围更大
  • 当浮点数尾数为规格化数时,浮点数的精度更高
  • 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
  • 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
  • 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数