计算机组成原理中的浮点数

本文深入解析IEEE754浮点数标准,详细阐述了32位浮点数的构成及其计算公式,包括符号位、阶码位、小数位的作用,以及规格化与非规格化值的计算方法。同时,对比分析了不同情况下浮点数值的取值范围,探讨了特殊值如无穷大和NaN的表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值