小数点在内存中的存储和整型是不一样的 由整型和小数两个部分组成
比如2.5 他的二进制为0010.1 小数点后面的1代表的是2^-1;也就是0.5
再来看一个数 5.5 二进制为101.1 写成1.011x2^2
来看一组标准
因为是二进制所以是2^2 也就是相当于十进制的10^2一样 根据这个标准 所有小数都以
V=(-1)^s x M x 2^E 这个方式存储
IEEE754规定:
对于32位的float,最高的一位存符号S,接着8为存E, 剩下的23位存有效数字M
对于64位的double ,最高以为存符号位S 接着11位存E 剩下的52位存有效数字M
浮点数存的过程
IEEE754对有效数字M和E有一些规定
因为1<=M<2的 所以可以写成1.xxxxx的形式 IEEE754规定计算机在保存M的值时,总是省略1只保留小数点等读取的时候再把1加上去 目的是为了节省空间 让更多的空间留给M
以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保
存24位有效数字。
E的存储比较复杂
首先 IEEE754规定E的值为 unsigned int
这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
小数点后面的数 的二进制有的配不出来所以有的小数点无法精确
浮点数的取出
E不为全0或1时 只要减去中间值即可
当E为全0时 E的真实值其实是-126或-1023 也就是相当于接近0 此时M就会变成0.xxxx 就是无穷小
当E全为1时 也就是255 E的真实值为128 2^128是一个非常非常大的数字 此时m为1.00000 这是就是无穷大