【cs基础】浮点数的存储

Wed 29 March 2017

#浮点数的存储 ##为什么讨论浮点数

  • 计算机只能识别二进制,整数转化为二进制没有任何问题。
  • 但是!浮点数有小数点, 计算机怎么识别!必然要有个规范来规定计算机怎么识别吧!这个规范就是国际标准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,指数范围0255; E为11,指数范围 02047

  • 但是!指数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)。

##单精度和双精度误差

  • 十进制转化为二进制的时候,要是永远除不尽,单精度转换为双精度的时候,位数变少,多余的值被省忽略了,就会产生误差的问题