https://jingyan.baidu.com/article/64d05a022ea757de55f73b1d.html
一、目前通用的IEEE754浮点数值的计算公式要更加复杂与精妙:
V=(−1)S∗M∗2E(公式1)
1.一个32位的IEEE浮点数的位向量分为三个部分:
[0(符号位) 00000000(阶码位) 00000000000000000000000(小数位)]
从右起,0-23位为小数位,24-31位为阶码位,32位最高位为符号位。
符号位:符号位比较好理解,在公式1中,如果符号位为0,V的值就会为正,如果符号位为1,V的值就会为负。设符号位的值为s。
阶码位:阶码位决定了V的取值范围,但它并不就是等于公式1中的E。设阶码位的值=exp,计算exp的值的方法采用无符号编码规则。
小数位:设小数位的值=frac,计算frac的值的方法是也是定点数表示法, frac[e23e22…e1e0]=e23−1+e22−2+…+e−231+e−240frac[e23e22…e1e0]=e23−1+e22−2+…+e1−23+e0−24。
注意:当一个浮点数的尾数为 0 时,不论其阶码为何值,或者当阶码的值遇到比它能表示的最小值还小时,不管其尾数为何值,计算机都把该浮点数看成 0 值,称为机器零。
计算IEEE浮点数值根据阶码的值分为三种情况:
在不同的情况中,公式1中的E与M的计算方式会有差异:
—情况1,阶码位非全0,并且非全1。这种情况下,浮点数的值被称为规格化的值。
—情况2,阶码位全0。非规格化的值。
—情况3,阶码位全1。特殊值。
先分析与比较32位的浮点数的情况1与情况2:
情况1中E与M的计算方法:
E=exp−Bias,M=1+frac,Bias=2浮点数的阶码位数−1−1(Bias的值:32位为127,64位1024)E=exp−Bias,M=1+frac,Bias=2浮点数的阶码位数−1−1(Bias的值:32位为127,64位1024)
情况2中E与M的计算方法:
E=1−Bias,M=frac,Bias=2浮点数的阶码位数−1−1(Bias的值:32位为127,64位1024)E=1−Bias,M=frac,Bias=2浮点数的阶码位数−1−1(Bias的值:32位为127,64位1024)
情况1之中,E的最小值是[00000001]2−127=−126[00000001]2−127=−126,最大值为[11111110]2—12710=254−127=127[11111110]2—12710=254−127=127。M的最小值是1+[00...00]2=11+[00...00]2=1,最大值为1+[11...11]=(2−ϵ)1+[11...11]=(2−ϵ)非常接近2的一个值。所以V的最大值为,V=(−1)0∗(2−ϵ)∗2127=(2−ϵ)∗1.701411835∗1038≈3.4∗1038V=(−1)0∗(2−ϵ)∗2127=(2−ϵ)∗1.701411835∗1038≈3.4∗1038,此时V的位向量是[0 11111110 11..11]。V的最小值为与最大值相比只是符号位变为了1,V=(−1)1∗(2−ϵ)∗2127≈−3.4∗1038V=(−1)1∗(2−ϵ)∗2127≈−3.4∗1038,V的位向量为[1 11111110 11..11]。V最接近0的值分别在0的两端,为V=(−1)0或1∗1∗2−126=±2−126V=(−1)0或1∗1∗2−126=±2−126。
情况2之中,E的值是唯一的,1-127=-126。M的最小值是[00...00]=0[00...00]=0,最大值为[11...11]=(1−ϵ)[11...11]=(1−ϵ)一个非常接近1的值。V的最大值为,V=(−1)0∗(1−ϵ)∗2−126≈2−126V=(−1)0∗(1−ϵ)∗2−126≈2−126。V的最小值与最大值相比只是符号位变为了1,为(−1)1∗(1−ϵ)∗2−126≈−2−126(−1)1∗(1−ϵ)∗2−126≈−2−126。V的最接近0的值为0,[0 0000000 00…00]。
随着小数位的值的递增以及符号位的变化,匹配值均匀分布在数轴上0的两端,±2−126±2−126之间,每两个匹配值的间距为2−232−23*。
比较情况1和情况2,有几个值得注意的点:
1,E:E决定了数值的取值范围,最小值,最大值,最接近0的正值,以及最接近0的负值。
2,±2−126±2−126:这两个数值犹如一个边界,再数轴上,两个数值的之间为非规格化数值,两个数值之外规格化的数值。规格化的数值最接近0的值分别为V=(−1)0或1∗1∗2−126=±2−126V=(−1)0或1∗1∗2−126=±2−126,非规格化的最大最小值为V=(−1)0或1∗(1−ϵ)∗2−126≈±2−126V=(−1)0或1∗(1−ϵ)∗2−126≈±2−126。在这个边界处,E的值是固定的,-127。这种平滑的过渡是由M在规格化值中的最小值设定1+frac,以及frac的最大值为1−ϵ1−ϵ 的特点所实现的。
3,小数位位数23:在数轴上,±2−126±2−126之间平均分布着223−1223−1个小数匹配值,每两个匹配值之间的间距为2^{-23}。在±2−126±2−126外侧,当frac值为0时,共有254个匹配值向数轴两端指数递增式的蔓延,在这些值中的每两个匹配值之间又有223−1223−1个匹配值,所以小数位的位数基本决定了浮点数的匹配值数量,浮点数的精度。
再看一下情况3,特殊值:
当阶码位全为1时,如果小数位全为0,此数表示无穷大,∞∞,而符号位决定了他是+∞+∞或−∞−∞。例如当一个float值除以0后它的值为无穷。
当阶码位全为1时,如果小数位不全为0,此数为NaN,not a number,不是一个数。两个值为无穷的float相减结果为NaN,如果一个float变量被赋值sqrt(-1),根号-1,它的值也会变为NaN。