定点数(fixd-point)
用压缩BCD编码表示小数,即用4bit二进制表示1位十进制,同时将小数点后的位数固定(故而称之为定点数)。此外,需要额外的4bit储存符号信息,0001为负,0000位正。例如,表示±9,999,999.99,需要5字节。-4,325,120.25可以表示为
0001010000110010010100010010000000100101 浮点数(floating-point)
单精度浮点数
首先,同整数一样,十进制小数也能够非常方便地转化成二进制小数。例如:十进制的5.8125,可以被表示成
5.8125=1×22+0×21+1×20+1×2−1+1×2−2+0×2−3+1×2−4 即101.1101。
IEEE标准下有两种浮点数表示格式:4字节的单精度格式和8字节的双精度格式。两种格式都采用科学计数法,让我们来看看4字节32bit的单精度格式各个位的含义
这样,一个数字就可以被表示为
(−1)s×1.f×2e−127 8位指数中0和255有一些特殊用处:
e=0,f=0,且s=0时表示0,s=1表示负0,即比0小的小数,该数字如此之小使得不能被单精度的数字和指数表示;
e=0,f=0,合法但是不规范,可以被表示为
(−1)s×0.f×2−127 e=255,f=0,无限大或者无限小,取决于符号位;
e=255,f=0,不是一个数(Not a Number,NaN)。
一般情况下,e取1∼254,因此单精度下能够表示的最小的正负二进制数为
±1.000000000000000000000002×2−126 最大的正负二进制数为
±1.111111111111111111111112×2127 单精度浮点数的问题
因为只有23位有效位,所以单精度浮点数的精度有限。比如,如果后面的指数为224,则
±1.000000000000000000000002×224=16,777,216 而
±1.000000000000000000000012×224=16,777,218 小于16,777,218而大于等于16,777,217的所有数字都将与16,777,217一样,被表示为同样的数字。
此外,使用单精度浮点数可能出现计算结果应该为3.50但是实际上表示出来的是3.499999。
双精度浮点数
8字节64bit的双精度格式各个位的含义
此时有效数字位数大大提升,大致相当于十进制的16位。