浮点数基础知识
浮点标准用 V = (-1)s * M * 2E
s:符号位决定这是一个正数还是一个负数,当s为0时为正数,1时为负数
M :尾数(有效数字位),该值是一个二进制小数,它的范围为(大于1,小于2)
E:指数位,又称阶码位,作用是对浮点数加权
在32位系统中 : 符号位(s)占最高位,之后8位为指数位(e),最后23位为尾数位(m)。
在64位系统中 : 符号位(s)占最高位,之后11位为指数位(e),最后52位为尾数位(m)。
如:125.125
125 = 1111101
0.125 = 0.001(2^-3)
125.125 用二进制表示:1.111101001 2^6
所以: s = 0
m = 111101001 (因为尾数部分在用二进制表示时,总是有规则 1 <= m < 2,计算机在储存时会隐藏小数点前的 ‘1’,也就是第一个‘1’,原本 m = 1.111101001;计算机存储时只存储小数点后的内容:m 111101001。因此,有效位共有23个bit位可以用,其实起到了24个bit的作用)
E = 127 +6 = 133 = 1000 0101(规定在原有基础上需要加上偏移值(32位中加127,64位加1023)以表示指数的正负)
0(s) 1000 0101(e) 11110100100000000000000(m) 一共32位
计算机存储浮点数的精度缺失问题
由于储存机制的限制,计算机中的浮点数并不能把实际的小数表示完全。在此基础上只能表示有限的有理数。
比如:
0 11111101 00000000000000000000001
0 11111101 0000000000000000000000
上述两个在计算机中存储的连续浮点数,两个数的差值却高达1.014 * 10的31次方。中间很多数无法表示。