浮点数的表示—IEEE754标准
引言
我们知道,在计算机中,数字以0和1组成的二进制序列来表示。但是,对于非常大的数字以及非常接近0的数字,简单的存储方式往往会造成精度的丢失。
为了解决这个问题,提供更高效的浮点数表示方法,各大厂商纷纷推出自己的浮点数表示标准。大约在1985年,IEEE(电气和电子工程师协会)推出了754标准,从此,江湖一统。
IEEE754标准浮点格式
IEEE754标准浮点格式由三部分组成:(−1)S∗M∗2E(-1)^S*M*2^E(−1)S∗M∗2E
- S:符号,表示浮点数是正数(s=0)还是负数(s=1)
- E:阶码,对浮点数进行加权。阶码被解释为以偏置形式表示的有符号整数,偏置值(Bias)为2(n−1)−12^{(n-1)}-12(n−1)−1,n为e所占的位数(Bias单精度为2(8−1)−1=12710=0111111122^{(8-1)}-1=127_{10}=0111 1111_22(8−1)−1=12710=011111112,双精度为2(11−1)−1=10232^{(11-1)}-1=10232(11−1)−1=1023)。
- M:尾数,用于表示小数
如下图所示,IEEE754标准浮点格式下的单精度浮点数占32位:符号占1位,阶码占8位,尾数占23位;双精度浮点数占64位。
规格化的值
当阶码位既不全为0也不全为1时,是规格化浮点数。此时E=e-Bias,M>=1。
例子:十进制的(−0.75)10(-0.75)_{10}(−0.75)10,将其转化为IEEE754格式:
- 转化为二进制:(−0.75)10=(−3/4)10=−(2−1+2−2)10=(−0.11)2(-0.75)_{10}=(-3/4)_{10}=-(2^{-1}+2^{-2})_{10}=(-0.11)_2(−0.75)10=(−3/4)10=−(2−1+2−2)10=(−0.11)2
- 写为(−1)S∗M∗2E(-1)^S*M*2^E(−1)S∗M∗2E格式:(−1)1∗1.12∗2−12(-1)^1*1.1_2*2^{-1_2}(−1)1∗1.12∗2−12
- S=1,E=-1,M=1.1,e=E+Bias=−110+12710=−000000012+011111112=011111102e=E+Bias=-1_{10}+127_{10}=-0000 0001_2 + 0111 1111_2 = 0111 1110_2e=E+Bias=−110+12710=−000000012+011111112=011111102,将M去除包含的最高位1只留小数部分得到m=2(−1)2=100000000000000000000002m=2^{(-1)_2}=100 0000 0000 0000 0000 0000_2m=2(−1)2=100000000000000000000002
- 组合S、e、m即得IEEE754格式:101111110100000000000000000000001 011 1111 0100 0000 0000 0000 0000 000010111111010000000000000000000000
非规格化的值
当阶码位全为0时,是非规格化浮点数。此时E=1-Bias。
因为M不需要>=1,所以提供了表示非常接近0值的方式。当尾数位也全为0时,表示0。
特殊值
当阶码位全为1时,是特殊浮点数。
此时,如果尾数位也全为1,当阶码位为1时代表负无穷,当阶码位为0时代表正无穷;
当尾数位不全为1时,代表NaN,(Not a Number)不是一个数。
242156)]
当尾数位不全为1时,代表NaN,(Not a Number)不是一个数。