浮点数的存储
为什么讨论浮点数
- 计算机只能识别二进制,整数转化为二进制没有任何问题。
- 但是!浮点数有小数点, 计算机怎么识别!必然要有个规范来规定计算机怎么识别吧!这个规范就是国际标准IEEE 754.
浮点数的识别规范
标准规定,任何浮点数的表现形式为
- V= (-1)^S x M x 2^E
- 符号位S
- 尾数位M
- 指数位E
32bit : 符号位1,指数位8,尾数位23
64bit : 符号位1,指数位11,尾数位52
尾数位 M 默认总是1.xxx的形式,秉着优化的概念,标准规定保存的时候可以舍弃,读取的时候再加上,这样尾数范围也增加了 1 位
指数位2^E , E为8,指数范围0~255; E为11,指数范围 0~2047
- 但是!指数E可能为负数 也就是说指数范围可能为-127-128了,为了不出现负数,标准规定采用移位存储,保存的E数据就要+127或者+1023;
- 比如E = 10,必须保存成10+127=137,即10001001
(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。
单精度和双精度误差
- 十进制转化为二进制的时候,要是永远除不尽,单精度转换为双精度的时候,位数变少,多余的值被省忽略了,就会产生误差的问题