根据国际标准IEEE(电⽓和电⼦⼯程协会)754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1) ^S* M ∗ 2^E
• (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是⼤于等于1,⼩于2的
• 2E 表⽰指数位
列如:5.0(5的二进制为101)=1.01*2^2=(-1)^0*1.01*2^2
对于任意一个浮点数我们都可以将其写类似于科学计数法的方式,只是这里使用的是二进制,同时用-1的0次或者1次来表示,即都可以写成IEEE754所规定的标准,其实计算机在进行储存的时候,就是储存的S,M,E这三个数
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
计算机对于M的存储
由于每一个M都有一个1,所以计算机就可以直接储存M的小数部分,这样就避免了浪费一个bit位,多一位来存储小数,可以提升精度。
十进制小数转化为二进制
对于小数点后面的部分,一般的放法是乘2法,即对于十进制的小数先乘以2,要是有进位1,就拿出来,要是没有,就拿出来0,然后继续拿出乘以后的小数点乘以2,这样一直循环,直到乘出来数字没有小数了,按照先后顺序排列这些拿出来的0或者1,即为对应的二进制数列
但对于一些相对于简单的,我们就可以根据二进制中小数部分的权重来直接写出,0.11111对应的权重从左到右分别就是2的负一次(0.5),2的负二次(0.25),2的负三次(0.125).....,我们通过这些组合就不难看出一些简单的小数,列如0.75就是0.5+0.25即二进制0.11
同时,对于一些小数,3.14无法精确的算出其二进制的小数位,此时计算机就会储存一个非常接近的数字来表示它
计算机对于E的储存
我们知道,在科学计数法中,E既可以是正数,也可以是负数,那么我们该怎么储存呢......
IEEE754于是就规定,我们在存储的时候,必须要给E加上一个中间值,让E成为一个正数,对于8位的E,中间值位127,对于11位的E,这个中间值位1023。列如:2^10,E=10,对于8位E来说,储存的数字就等于10+127=137。
对于一些特殊的E
1.E全为1,2的这么多次将是一个极其大的数字,计算机将认为存储的是一个无穷大的数字
2.E全为0,2的负这么多次将是一个非常小的数字,计算机对于此类数字E=1-127(1-1023)表示真实值,同时M不再加上1,计算机用来表示一个非常接近于0的数字,或则是正负0.
列如