十万个为什么 [浮点数] 浮点数的表示
// 32位浮点数 s(符号1位)eeeeeeee(指数8位)mmmmmmmmmmmmmmmmmmmmmmm(位数23位)
// 64位浮点数 s(符号1位)eeeeeeeeeeee(指数12位)mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm(位数53位)
// 32位浮点数公式是 s?(-1):(1) * (1.mmmmmmmmmmmmmmmmmmmmmmm) ^ (eeeeeeee - 127)
// 64位浮点数公式是 s?(-1):(1) * (1.mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm) ^ (eeeeeeeeeeee - 1023)
// 以32位举例, 1.0f 为 00111111100000000000000000000000
-- 求64位浮点数的尾数
-- number of bits in the mantissa of a floating-point number
local floatbits = 24
do
local p = 2.0 ^ floatbits
while p < p + 1.0 do
p = p * 2.0
floatbits = floatbits + 1
end
end
/*
对于32位浮点数
右边 是 左边+1
e-127 = 00: 00111111100000000000000000000000 01000000000000000000000000000000
e-127 = 01: 01000000000000000000000000000000 01000000010000000000000000000000
e-127 = 02: 01000000100000000000000000000000 01000000101000000000000000000000
e-127 = 03: 01000001000000000000000000000000 01000001000100000000000000000000
e-127 = 04: 01000001100000000000000000000000 01000001100010000000000000000000
e-127 = 05: 01000010000000000000000000000000 01000010000001000000000000000000
e-127 = 06: 01000010100000000000000000000000 01000010100000100000000000000000
e-127 = 07: 01000011000000000000000000000000 01000011000000010000000000000000
e-127 = 08: 01000011100000000000000000000000 01000011100000001000000000000000
e-127 = 09: 01000100000000000000000000000000 01000100000000000100000000000000
e-127 = 10: 01000100100000000000000000000000 01000100100000000010000000000000
e-127 = 11: 01000101000000000000000000000000 01000101000000000001000000000000
e-127 = 12: 01000101100000000000000000000000 01000101100000000000100000000000
e-127 = 13: 01000110000000000000000000000000 01000110000000000000010000000000
e-127 = 14: 01000110100000000000000000000000 01000110100000000000001000000000
e-127 = 15: 01000111000000000000000000000000 01000111000000000000000100000000
e-127 = 16: 01000111100000000000000000000000 01000111100000000000000010000000
e-127 = 17: 01001000000000000000000000000000 01001000000000000000000001000000
e-127 = 18: 01001000100000000000000000000000 01001000100000000000000000100000
e-127 = 19: 01001001000000000000000000000000 01001001000000000000000000010000
e-127 = 20: 01001001100000000000000000000000 01001001100000000000000000001000
e-127 = 21: 01001010000000000000000000000000 01001010000000000000000000000100
e-127 = 22: 01001010100000000000000000000000 01001010100000000000000000000010
e-127 = 23: 01001011000000000000000000000000 01001011000000000000000000000001
e-127 = 24: 01001011100000000000000000000000 01001011100000000000000000000000
e-127 = 25: 01001100000000000000000000000000 01001100000000000000000000000000
e-127 = 26: 01001100100000000000000000000000 01001100100000000000000000000000
e-127 = 27: 01001101000000000000000000000000 01001101000000000000000000000000
e-127 = 28: 01001101100000000000000000000000 01001101100000000000000000000000
e-127 = 29: 01001110000000000000000000000000 01001110000000000000000000000000
e-127 = 30: 01001110100000000000000000000000 01001110100000000000000000000000
e-127 = 31: 11001111000000000000000000000000 11001111000000000000000000000000
可见 2^23 也 就是 e-127 = 24时 左边 == 右边
*/
注意: 如果进行浮点数判断, 当e-127=24时, a == a + 1只有在gcc -O0的时候成立, 否则需要给变量添加volatile关键字规避优化