第23章:定点数和浮点数

定点数(fixd-point)

用压缩BCD编码表示小数,即用4bit二进制表示1位十进制,同时将小数点后的位数固定(故而称之为定点数)。此外,需要额外的4bit储存符号信息,0001为负,0000位正。例如,表示±9,999,999.99\pm 9,999,999.99,需要5字节。-4,325,120.25可以表示为

0001  0100  0011  0010  0101  0001  0010  0000  0010  01010001 \; 0100 \; 0011 \; 0010 \; 0101 \; 0001 \; 0010 \; 0000 \; 0010 \; 0101

浮点数(floating-point)

单精度浮点数

首先,同整数一样,十进制小数也能够非常方便地转化成二进制小数。例如:十进制的5.8125,可以被表示成

5.8125=1×22+0×21+1×20+1×21+1×22+0×23+1×245.8125 = 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 + 1 \times 2^{-1} + 1 \times 2^{-2} + 0 \times 2^{-3} + 1 \times 2^{-4}

101.1101101.1101

IEEE标准下有两种浮点数表示格式:4字节的单精度格式和8字节的双精度格式。两种格式都采用科学计数法,让我们来看看4字节32bit的单精度格式各个位的含义

s = 1位符号

e=8位指数

f = 23位有效数字

这样,一个数字就可以被表示为

(1)s×1.f×2e127(-1)^s \times 1.f \times 2^{e - 127}

8位指数中0和255有一些特殊用处:

  • e=0,f=0e = 0, f = 0,且s=0时表示0,s=1表示负0,即比0小的小数,该数字如此之小使得不能被单精度的数字和指数表示;

  • e=0,f0e = 0, f \neq 0,合法但是不规范,可以被表示为

(1)s×0.f×2127(-1)^s \times 0.f \times 2^{- 127}
  • e=255,f=0e = 255, f = 0,无限大或者无限小,取决于符号位;

  • e=255,f0e = 255, f \neq 0,不是一个数(Not a Number,NaN)。

一般情况下,e取12541 \sim 254,因此单精度下能够表示的最小的正负二进制数为

±1.000000000000000000000002×2126\pm 1.00000000000000000000000_2 \times 2^{-126}

最大的正负二进制数为

±1.111111111111111111111112×2127\pm 1.11111111111111111111111_2 \times 2^{127}

单精度浮点数的问题

因为只有23位有效位,所以单精度浮点数的精度有限。比如,如果后面的指数为2242^24,则

±1.000000000000000000000002×224=16,777,216\pm 1.00000000000000000000000_2 \times 2^{24} = 16,777,216

±1.000000000000000000000012×224=16,777,218\pm 1.00000000000000000000001_2 \times 2^{24} = 16,777,218

小于16,777,218而大于等于16,777,217的所有数字都将与16,777,217一样,被表示为同样的数字。

此外,使用单精度浮点数可能出现计算结果应该为3.50但是实际上表示出来的是3.499999。

双精度浮点数

8字节64bit的双精度格式各个位的含义

s = 1位符号

e=11位指数

f = 52位有效数字

此时有效数字位数大大提升,大致相当于十进制的16位。

Last updated