🌈个人主页:小新_-
🎈个人座右铭:“成功者不是从不失败的人,而是从不放弃的人!”🎈
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
🏆所属专栏: 计算机组成原理 欢迎订阅,持续更新中~~~
✨让小新带着你快乐的学习吧~✨
目录
一、浮点数的表示形式和表示范围
首先回顾·一下定点数的表示
定点数(纯小数)在计算机中的表现形式
在计算机中,定点小数主要用来表示浮点数的尾数,没有高级语言数据类型与之对应
定点小数的机器码
定点整数在计算机中的表现形式
在C语言中,char,short,int ,long型都属于定点整数
总结
定点数所能表示的数据范围与以下因素有关。
- 机器字长:字长越长,其表示的数据范围越大。
- 所采用的机器码:补码和移码所能表示的数据范围,比原码和反码所能表示的数据范围要多一个最小负数
1、浮点数表示
二进制浮点数可采用类似十进制科学计数法的表示方式
【举例】
2、浮点数的表示范围
- 尽管浮点数有效扩大了数据的有效范围,但受到机器字长的限制,浮点数仍存在溢出现象。
- 当浮点数的阶码大于最大阶码时,称为上溢,此时机器停止运算,浮点运算器会显示溢出标志。
- 当浮点数的阶码小于最小阶码时,称为下溢,虽然此时数据不能被精确表示,但由于发生下溢时绝对值很小,通常将尾数强制为0,按机器0处理,此时机器可以继续运行。
- 当一个浮点数在正负数区域但并不在摸个数轴刻度上时,也会出现精度溢出问题,此时只能用近似数表示
- 一旦浮点数的位数确定后,合理分配阶码E和尾数M的位数,直接影响浮点数的表示范围和精度
- 短实数(32bit):阶码E取8位(含1位阶符),尾数M取24位(含1位数位)。
- 长实数(64bit):阶码E取11位(含1位阶符),尾数M取53位(含1位数位)。 IEEE 754
- 临时短实数(80bit):阶码E取15位(含1位阶符),尾数M取65位(含1位数位)。
3、练习
二、浮点数的规格化
1、规格化方法及作用
同一浮点数可能存在多种表现形式,也就是会有不同的阶码和尾数的组合。
- 通常要求浮点数在数据表示时对尾数进行规格化处理,即使得尾数的最高数值必须是一个有效值。
- 浮点数规格化有以下好处:
- 使得浮点数表示形式唯一
- 使得浮点数表述精度更高
- 对于非规格化尾数,需要对其进行规格化处理,即根据具体形式通过将非规格化尾数的数据值部分进行左移或者右移,并相应减少或者增加阶码值的操作进行规格化,对应的规格化方法称为向左规格化(简称左规)和向右规格化(简称右规)。
- 对于基数r不同的浮点数,因其规格化数的形式不同,规格化过程也不同。
- 当r=2时,尾数数值部分最高位为1的数是规格化数
左规:尾数数值部分每左移一位,阶码减1. 右规:尾数数值部分每右移一位,阶码加1.
2.当r=4时,尾数数值部分最高位2位不全为0的数为规格化数
左规:尾数数值部分每左移2位,阶码减1. 右规:尾数数值部分每右移2位,阶码加1.
3.当r=8时,尾数数值部分最高位3位不全为0的数为规格化数
左规:尾数数值部分每左移2位,阶码减1. 右规:尾数数值部分每右移2位,阶码加1.
- 基数r不同,对数的表示范围和精度都有影响,一般来说:
- 基数r越大,可表示的浮点数范围越大,而且所表示的数的个数越多。但浮点数的精度反而下降。
【举例】
2、规格化后的表示范围
3、练习
三、IEEE 754浮点数标准
1、浮点数表示形式和范围
- 浮点数的上述表示形式,既没有规定阶码和尾数的位数,也没有规定阶码和尾数采用的机器码形式(原码、反码、补码和移码)。
- 实际上,直到20世纪80年代初,浮点数表示形式还没有统一标准,不同厂商计算机内部浮点数表示形式可能不同。
不同体系结构的计算机之间进行数据传送或程序移植时,必须进行数据格式的转换,并且数据格式转换还会带来运算结果的不一致。
- 因此,美国电气及电子工程师协会 (Institute of Electrical and Electronics Engineers,IEEE)于1985年发布了浮点数标准IEEE754。
目前,几乎所有计算机都采用IEEE 754标准表示浮点数。
2、IEEE 754浮点数标准
3、阶码
4、尾数
5、标准
6、练习
四、浮点数表示范围
1、单精度
2、浮点数表示范围
3、练习
- 十进制小数转换成二进制小数时,可能出现无限循环小数,只能转换到符合精度要求的位数(即所谓的精度缺失)。
- IEEE 754浮点数格式位数有限(单精度32位、双精度64位),无法精确表示无限循环小数。
通常只能采用舍入的方式近似表示,因此会带来数据表示的误差。这种误差会在计算的过程中不断累积放大,可能导致严重后果。
【举例】采用双精度浮点数运算
0.1+0.1+0.1-0.3≠0
0.7-0.2≠0.5
3.3+1.1≠3
- ■综上所述,程序员使用二进制浮点数编程时一定要非常小心,要充分考虑浮点数运算可能带来的计算误差◇尽量避免对浮点数进行直接比较◇在一些对误差极其敏感的情况下,建议采用十进制浮点数进行运算。
最后,感谢大家的观看!