软件开发工程师修炼中|
2022-04-12 12:09阅读: 272评论: 0推荐: 0

IEEE浮点数

IEEE浮点数

在这节课中讲解了有关于浮点数的相关内容,对我来说在理解上比整数的补码表示要复杂的多,这里总结一下课上的内容以及自己的一些理解。

首先要知道对于小数来说,二进制只能准确表示形如x/2^k这种有理数,不满足这种形式的数需要循环重复位才能被准确表示,但是计算机的位数始终是有限的,因此这些数无法被准确表示。

另外,在有限的位数中,小数点的位置会对表示数的范围以及表示的数的精度产生影响。比如小数点靠左的话,所能表示数的范围就变小了,但是因为小数点右边的位数增加,因此所能表示的小数精度上升了。反之,同理。

基于上述描述,选用了浮点数这一折中的方法。浮点数的一般形式:(-1)^S×M×2^E。其中,

  • S表示符号位,决定浮点数的正负,对于数值0也分正负0这种特殊情况
  • M表示尾数,是一个二进制小数
  • E表示阶码

浮点数的位被划分为三个字段,分别对上述字段进行编码。符号位s直接编码符号位S,k位的阶码编码阶码E,剩下n位数字编码尾数M,这个编码出来的数值也与阶码是否为0有关,后续会介绍到。

下面以C语言中的单精度浮点数(即float)来举例说明计算机中对于浮点数的编码。
对于32位的浮点数,最高的一位用于表示符号,接下来的8位用于编码阶码,最后23位用于编码尾数。对于符号位的编码很容易,0表示正数,1表示负数。根据k位的阶码的值的不同,被编码的值可以分成三种情况:规格化的值,非规格化的值以及特殊值。下面将分别介绍这三种,并在最后给出总结。

1. 规格化的值。

规格化的值的特点是用于编码阶码E的k位的数值既不全为0,也不全为1。在这里,阶码E被表示为E = e - Bias。e则是计算机中k位无符号数,取值范围在0-255(对于float而言)之间,Bias则是一个值为2^(k-1)-1的偏置值,因为这种设置,阶码所能取到的值刚好使得0处于中间位置。剩下用于表示尾数的小数字段f,则M=f+1,相当于有一个隐含的以1开头的表示,因此M的范围就是M>=1 && M < 2。

2. 非规格化的数。

当阶码域,即e全为0时,表示的数是非规格化形式。此时阶码值E=1-Bias,尾数M=f,并不包含隐含的1

这里使阶码值为1-Bias而不是直觉上的-Bias,是为了提供一种从非规格化值平滑到规格化值的方法。举个例子说明这种平滑过渡:假定有8位格式,一位符号位,4位阶码和3位尾数,那么最大的非规格化值则是7/512,最小的规格化值则是8/512,实现了平滑过渡。

非规格化数有两个用途:

  1. 提供了一种表示0的方法。由于规格化数的尾数部分始终大于等于1,因此无法表示0。那么这时候就会产生符号位为0/1,阶码域与尾数域均为0的+0.0与-0.0的情况。书中没有具体说明两者不同与相同的情况,只是说了在某些方面被认为是不同的,在某些方面是相同的。
  2. 另外一个功能是表示那些非常接近0.0的数。这里提到了一种称为逐渐下溢(gradual underflow)的属性,使可能的数值均匀地接近于0。

查了一点有关于逐渐下溢的内容,从字面上理解就是一个逐渐朝会下溢的方向走,但是如果使用之前提到的规格化值是无法实现这个目的的,因此诞生了非规格化数来实现这个不断接近0的过程,就可以表达出更小的数字了

3.特殊的值

特殊值指的是阶码域全为1的时候。此时,当小数域全为0时则表示无穷,符号位为0是正无穷,符号位为1是负无穷。无穷能够表示溢出的结果。如果小数域不为0,结果值被称为NaN(Not a Number)。

到这里就介绍完了C语言中浮点数的表示的介绍,可以看到前人在表示小数上的智慧,通过一系列设计使得计算机表示小数的方式更加合理。接下来,将介绍浮点数在实际计算中的一些性质,主要是介绍舍入以及浮点数运算的基本情况。

舍入

根据IEEE的标准,有四种舍入方式:向上舍入,向下舍入,向0舍入,向偶数舍入。其中向偶数舍入有其统计学上的意义,即50%的情况下向上舍入,50%的情况下向下舍入。在支持IEEE浮点数的机器上,使用向偶数舍入的舍入方式。

这里是否是偶数只考虑最低有效位是否是偶数

浮点数运算

浮点数运算中,令我印象最深刻的则是加法/乘法均不符合结合律。

(3.14+1e10)-1e10 != 3.14 + (1e10-1e10)

但是浮点数加法/乘法满足单调性,这是无符号数或者补码的加法/乘法所没有的。

单调性即,如果a >= b,那么对于任何的a,b,x(除了NaN),都有x+a>=x+b

C语言中,在进行类型转换时,int->double不会有损失,而int->float时,由于int的位数比float的尾数位数多,因此会出现舍入。

总结

这篇笔记基于《深入理解计算机系统》以及作者相应的课程。有关于浮点数值得探究的内容还有很多,这里只是做了个一个大致的介绍,在遇到实际的问题时,还需要具体问题具体分析,结合语言特点解决问题。比如C语言的标准并不要求机器使用IEEE浮点,因此没有标准的方法来改变舍入方式或者得到-0,+∞、-∞或者NaN之类的特殊值。

参考资料

深入理解计算机系统原书第三版

本文作者:无涯清酒

本文链接:https://www.cnblogs.com/wuyawine/p/16134497.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   无涯清酒  阅读(272)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起