对于一个给定的浮点数表示:
假设这是一个规格化的单精度浮点数(S占用1bit, E占用8bit,M占用23bit),通常的解释是:
(-1)^S * 1.M * 2^(E-127)
如果我们把浮点数的表示看成这样的三个部分,可以得到一个更直观的解释:
符号位不变。对于指数部分,可以认为是一个窗口,这个窗口边界由两个连续的2的幂的整数构成。尾数部分则认为是窗口中的偏移。
窗口表示了这个浮点数将会落在那两个整数中间:[0.5,1], [1,2], [2,4], [4,8]
直到[2^127,2^128]
。偏移则将窗口分成了2^23 = 8388608
个片段。使用窗口和偏移你就可以近似一个值。窗口是一个防止溢出的优秀机制。一旦到达窗口的上界(比如[2,4]
),就可以浮动到右边另一个更大范围的窗口中(比如[4,8]
)。只是在窗口变大两倍的同时精度有所丢失。
举例说明一下,下面使用这种模型将3.14
编码为浮点数表示。
3.14
是正数,所以S = 0
3.14
位于2和4之间那么窗口下界是2^1 -> E=128
(参见公式中窗口的值是2^(E-127)
)- 有
2^23
个偏移量可以用来表示3.14
落在区间[2-4]
哪个地方。由于这个数在区间的((3.14-2)/(4-2)=0.57
)位置,所以偏移量是M = 2^23 * 0.57 = 4781507
这几个数转化成二进制是:
- S = 0 = 0b
- E = 128 = 10000000b
- M = 4781507 = 10010001111010111000011b
因此3.14这个值的近似表示是3.1400001049041748046875