浮点数的表示思想是基于科学计数法的。例如:1234.5用科学计数法可表示为 1.2345 × 1 0 3 1.2345 \times 10^3 1.2345×103,其中1.2345称为尾数(mantissa),3称为指数或阶(exponent),10称为基数(radix)。在已知进制的情况下,只需要记录尾数和指数即可表示这个浮点数。
同理,在计算机中浮点数表示以2为基数,只需记录尾数和指数即可。例如: 33.25 = ( 100001.01 ) 2 × 2 0 = ( 0.10000101 ) 2 × 2 6 33.25=(100001.01)_2 \times 2^0 =(0.10000101)_2 \times 2^{6} 33.25=(100001.01)2×20=(0.10000101)2×26,在计算机中,只需要记录0.10000101和6即可。
为了在计算机中表示一个浮点数,我们需要表示其尾数和指数。指数使用阶码(移码)来表示,尾数表达均以0.1开头,因此只存储0.1后的数字,这样可以增加表示的范围。例如在32位浮点数中,用8位移码(bias= 2 8 − 1 = 128 2^{8-1}=128 28−1=128)表示指数,则 33.25 = ( 0.10000101 ) 2 × 2 6 33.25 = (0.10000101)_{2} \times 2^{6} 33.25=(0.10000101)2×26中指数可存储为 6 + 128 = 134 = ( 10000110 ) 2 6+128=134=(10000110)_2 6+128=134=(10000110)2,的尾数部分存储为 ( 00001010000000000000000 ) 2 (00001010000000000000000)_2 (00001010000000000000000)2。
0(符号位) | 1~8(阶) | 9~31(尾数) |
---|---|---|
0 | 10000110 | 00001010000000000000000 |
上述存储模型中移码范围 [ ( 00000000 ) 2 , ( 11111111 ) 2 ] [(00000000)_2,(11111111)_2] [(00000000)2,(11111111)2],实际表示范围为[-128,127]。尾数的表示范围 [ ( 0.10...0 ) 2 , ( 0.11...1 ) 2 ] [(0.10...0)_2,(0.11...1)_2] [(0.10...0)2,(0.11...1)2],即 [ 2 − 1 , 2 0 − 2 − 24 ] [2^{-1},2^0-2^{-24}] [2−1,20−2−24]。所以该模型能表达的最大正数0.11…1 × 2 11...1 = ( 1 − 2 − 24 ) × 2 127 \times 2^{11...1}=(1-2^{-24}) \times 2^{127} ×211...1=(1−2−24)×2127,最小正数0.10…0 × 2 00...0 = 1 2 × 2 − 128 = 2 − 129 \times 2^{00...0}=\frac{1}{2} \times 2^{-128}=2^{-129} ×200...0=21×2−128=2