基数、尾数、阶码、精度、范围、规格化、单精度浮点数((32bit)、双精度浮点数((64bit)、IEEE754 讲解

        在本个内容中我们会进行基数、尾数、阶码、精度、范围、规格化、单精度浮点数((32bit)、双精度浮点数((64bit)、IEEE754 讲解的相关内容讲解,本文参考于吴迪副教授的资料,浙江大学华中科技大学课程所著

一、定点表示

        既然需要引入浮点数,那么更多的问题是:

        浮点数能够模拟数轴上连续的小数吗?精度?

        浮点表示的格式是什么?

        尾数和阶码的基值必须是 2 吗?基值的影响?

        数的范围与精度和哪些因素有关?

        为什么要引入规格化表示?

        目前浮点数表示格式的标准是什么?

(复习内容)回忆定点数:下面,公式要写在笔记上,用作后面举例计算【浮点数精度】的讲解依据

二、浮点表示的定义和范围

CLAIM(1:基数为 2 时,数位右/左移几位,阶码就加/减几;反过来也一样。)

以下内容要抄在笔记上,随时查看。

        阶码——其位数决定数据表示的范围,阶码的位数越多,能表示的数据范围也就越大;而阶码的 值和阶符共同决定了小数点的位置(注意对照观察右边的具体例子)

        尾数——尾数的尾数决定了数据表示的精度(数轴上的最小刻度)。阶码长度相同的时候,分配 给尾数的数位越多,数据的精度就越高。

         注意:E 为定点整数,M 为定点小数。我们之前学过的定点数的表示方法,在这里得到了应用。

         这里的【浮点数格式框图】要画在黑板上,用作后面举例计算【浮点数精度】的讲解依据

E——阶码部分,假设用 4 位数位(k=4)表示,一共是 5 位,还有 1 位符号位

M——尾数部分,设用 10 位数位(n=10)表示,一共 11 位,其中 1 位是符号位

        这样,一共便是 16 位,我们的机器假设就是 16 位的机器,一共能表示的二进制数的个数就是 2 16 个,如果我们的机器用这个格式来表示浮点数的话,也就是用 2 16 个数来表示最小负数和最大正数之 间的所有的数。而 2 16也就是 6 万多个数,实际上是用有限的数据,来表示无限的实数。

        根据【笔记上画的浮点数框图、和浮点数公式】,我们来计算最小、最大负数;对于最小、最大 正数的计算,大家自行思考。(【注意:这里所有的计算是用原码表示的】((如果是补码表示 的,可以根据补码的公式得到) 

      

2^{10}

问 1:在 k=4,n=10 时,浮点数的精度是多少?正数的范围是从多少到多少?

        答:精度(最小刻度):0.00(0000(0001; 范围:正数从 0.00(0000(0001×2 -15→0.11( 1111(1111×2 15,最小数接近 0,最大的数接近 32768。

问 2:从 0.00(0000(0001×2^{-15})到 0.11(1111(1111×2^{-15}),一共有多少个数?

        答:2^{10} -1 个

问 3:一共有多少个正数?(原码)

        答:阶码从-15→+15 共 31 个,每个阶码对应了(2^{10}-1)个尾数,31×(2^{10} -1)≈31000 个。

CLAIM 3: 浮点数的精度和尾数的位数有关,尾数的位数越多,精度越高;

                   浮点数的范围与阶码的位数有关,阶码的位数越多,范围越大。

上溢出时:浮点运算器的溢出标记位设置为 1。

下溢出 时:由于绝对值很小,则按照机器 0 处理。

精度溢出:浮点数确实在“正数区”和“负数区”,但是不在某个刻度上的时候,此时只能做(“ 舍入”((近似数)处理。比如:0.00 0000 1101 101×2^{-9},在 0.00 0000 1101×2 -9 与 0.00 0000 1110×2^{-9}之间。 

三、浮点表示的规格化

四、IEEE(754 标准

为什么需要浮点数表示的标准?

        答:虽然我们定义了浮点数的存储方式,优化了浮点数的存储(规格化),但是浮点数的一般格 式没有规定①数的位数②机器码的形式:原、补、反?所以,如果看成不同的机器码,则对应的真值 都不同,便不是一个数。

        IEEE754 规定:阶码用移码表示。为什么要采用移码?这主要是为了让阶码的值成为非负,便于 浮点数的比较和排序。让我们复习移码,查看【移码的表格】

        对于单精度浮点数,本来的阶码 E: 1,1111111→0,1111111 即:-127→+127

        为了方便,使得阶码最低位等于 0,所以需要+127(偏移量):

         现在+127 移码后:0→+254, 即:现在的 E(移码)0→254。

         规格化的方式:最高位为“1”是隐含的:即(【尾数】的第一位固定为 1,那么,我们就可以少 存储一位,即【隐含】掉,也就是说,表示的时候不表示(存储的时候不存储),计算的时候补上它 就可以了,这样的话,实际上是增加了尾数,从而增加了数据表示的精度。 

        另外,需要指出的是:与之前的浮点表示类似,规格化浮点数在数轴上的刻度分布不是均匀的, 因为同样的道理,指数每加 1,数的数值就扩大为原来的 2 倍,而此范围内包含的数的个数与扩大之 前是一样的,所以,刻度只会越来越稀疏。

CLAIM 4: 偏移量越大,则规格化数的范围越小、非规格化数的精度越高。

 

 

        我们要认识到,这样的误差会导致严重的后果,特别是那些对误差极其敏感的情况(火箭发射、 金融计算),好在 2008 年 IEEE 754 标准进行了修订,引入了十进制浮点数——DFP 编码,

        最后,我们来学习一个例子。

IEEE 754标准中处理溢出尾数溢出是确保浮点数运算正确性的关键步骤。针对单精度32位)双精度64位)浮点数的处理策略略有不同,但核心原则是一致的。 参考资源链接:[IEEE 754标准下的浮点数溢出处理与规格化表示](https://wenku.csdn.net/doc/5q2rrjs6ff?spm=1055.2569.3001.10343) 首先,溢出指的是运算结果的指数部分超出了浮点数格式所能表示的范围。对于单精度浮点数,指数部分占8位,可表示的范围是-126到+127(偏移量为127);双精度浮点数指数部分占11位,范围是-1022到+1023(偏移量为1023)。当溢出时,处理策略通常包括: 1. 向上溢出:结果被视为无穷大,符号由原始数决定。例如,当计算结果为正数且超出表示范围时,结果应表示为正无穷大。 2. 向下溢出:结果被设置为最接近的可表示的非规格化数或零。例如,在单精度浮点数中,最小规格化数是\(1.0 \times 2^{-126}\),而最小非规格化数是\(1.0 \times 2^{-149}\)。 尾数溢出发生在小数部分超出了可容纳的位数。在IEEE 754标准中,尾数通常经过规格化处理,以保证其在运算过程中不会溢出。处理尾数溢出的策略包括: 1. 舍入:将尾数部分超出的部分舍入,最常用的舍入方式包括最近舍入、向零舍入、向正无穷舍入向负无穷舍入。 2. 截断:直接丢弃超出部分,保留剩余部分作为结果。但这种方法会引入较大的舍入误差。 以单精度浮点数溢出处理为例,假设我们计算\(2^{128}\)时发生的溢出,由于该结果超出了单精度浮点数的表示范围,因此结果将被视为无穷大。在实际编中,这可能表现为特殊的浮点数常量,例如在C语言中用`INFINITY`表示。 针对尾数溢出,例如计算\(1.0 \times 10^{30}\)时,由于尾数部分将超出单精度浮点数的表示范围,我们可以选择最近舍入到\(1.0 \times 10^{38}\),这是单精度浮点数能表示的最大规格化数。 为了更深入理解这些处理策略,并能在实际编程中正确应对浮点数运算中的溢出尾数溢出,我建议阅读《IEEE 754标准下的浮点数溢出处理与规格化表示》。这本书提供了详细的理论背景示例,帮助开发者在遵循IEEE 754标准的同时,设计出更加鲁棒的浮点数算法应用。 参考资源链接:[IEEE 754标准下的浮点数溢出处理与规格化表示](https://wenku.csdn.net/doc/5q2rrjs6ff?spm=1055.2569.3001.10343)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值