浮点的计算方法
- 1、计算步骤
- 2、基本要素
- 2.1 浮点数
- 2.2 规格化浮点数
- 2.3 偏置指数
- 2.4 IEEE浮点数
- 2.5 特点
- 3、计算实例
- 4、舍入机制
- 扩展:乘除计算步骤
1、计算步骤
浮点数格式:
单精度:符号位1位,阶码8位,尾数23位
双精度:符号位1位,阶码11位,尾数52位
阶码是移码表示
浮点数的加减运算的五个步骤:对阶、尾数运算、规格化、舍入(要求使用对偶舍入)(0舍1入)、溢出判断。
对阶:小阶向大阶转换,对完阶后浮点数组成为大阶码+尾数;尾数相加用新的尾数(包括低位移出的位数)
规格化:(保证小数点左右两边不同,可能规格化好几次)是指相加的尾数格式是否符合左规右规。
右规:01.xxxx或者10.xxxx,将尾数连同符号位右移一位,和的阶加1,最终得到00.1xxxx或者11.0xxxx
左规:当尾数连同符号位为00.0xxxx或者11.1xxx(即小数点左右两位相同);将尾数连同符号位左移一位,和的阶减1
溢出:部分符号位01或者10 不溢出(即阶码的符号位中出现01或者10时才溢出);尾数的符号位中出现01或者10时右规
2、基本要素
2.1 浮点数
浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。
2.2 规格化浮点数
IEEE 754浮点数的尾数总是规格化的,其范围为1.000…0 × 2e~ 1.111…1 × 2 e ,e为指数。
规格化浮点数的最高位总是1,规格化使尾数的所有位都是有效的,因而尾数精度更高。
如:0.10… × 2 e规 格 化 为 1.10… × 2 e-1
10.1… 2 e 规 格 化 为 1.01… × 2 e+1
尾数规格化充分利用了可用的最大精度。如,一个8位非规格话的尾数0.0000101只有4位有效位,而规格化后的8位尾数1.0100011则有8位有效位。
2.3 偏置指数
IEEE 754浮点数的尾数被表示为符号及值的形式,即用一个符号位表示它是正数还是负数。它的指数则用偏置方式表示(即阶码是移码表示),即给真正的指数加上一个常数。
其他的浮点详细信息可见:浮点的表示方法 已知32位单精度浮点数的指数部分是8位,则偏置值为127。如果一个数的指数为0,则被保存为 0+127=127。如果指数为-2,则被保存为− 2 + 127 = 125 。如果指数为-1,则被保存为− 1 + 127 = 126 。
实数1010.1111规格化的结果为1.010111 × 2 3 ,指数为3,将被保存为3 + 127 = 130 。
这种用偏置表示指数的方法优点在于:最小的负指数被表示为0,如果不采用这种方法,0的浮点表示为0.0…0×2{最小负指数},采用偏置指数。0就可以用尾数0和指数0表示:
2.4 IEEE浮点数
一个32位IEEE 754单精度浮点数可以被表示为下面的二进制串:
S EEEEEEEE 1.MMMMMMMMMMMMMMMMMMMMMMM
S为符号位,指明这个数是正数还是负数
E为8位偏置指数,指出了小数点的位置
M为23位尾数
IEEE浮点数的尾数总是规格化的,其值范围在1.0000…00 − 1.1111…11 1.0000…00-1.1111…111.0000…00−1.1111…11 ,除非这个浮点数是0,此时尾数为0.000…00 0.000…000.000…00。
由于尾数总是规格化的,且最高位总是为1,因此将尾数存入存储器时没有必要保存最高位的1。所以,一个非0的IEEE 754浮点数可被定义为:X = ( − 1 ) S × 2^E − B^ × 1. F X,其中:
S符号位
E:偏置量为B的指数
F:尾数的小数部分(实际的尾数为1.F,有个隐含的1)
ps:浮点数0被表示为S=0,E=0,M=0(即浮点数0用全0表示)
在32位IEEE 754单精度浮点数格式中,最大指数E_{max}为127,最小指数E_{min}为-126,而不是−127至128。E_{min} -1(即-127)用来表示浮点0,E_{max} +1(即128)用来表示正/负无穷大或NaN数。
tips:nan是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用,是以浮点数表示实数时的特殊值。
下图,描述了IEEE单精度浮点数格式,指数E=0和E=255等特例分别被用于表示浮点0,非规格化效数、正/负无穷大、以及NaN:
2.5 特点
(1)浮点数接近0时的特点,下图描述了一个指数2位,尾数为2位的浮点数系统。浮点数0表示00 000,下一个规格化的正数表示为00 100(即2−b× 1.00 ,b为偏置常数):
浮点数0附近有一块禁止区,其中的浮点数都是非规格化的,因此无法被表示为IEEE标准格式。这个数的指数和起始位都是0的区域,也可用来表示浮点数。但是这些数都是非规格化的,其精度比规格化的精度低,会导致渐进式下溢。
(2)IEEE标准规定,缺省的舍入技术应该向最近的值舍入。
(3)IEEE标准规定了4种比较结果,分别是等于、小于、大于和无序,无序用于一个操作数是NaN数的情景。
(4)IEEE标准规定了5种异常:
1.操作数不合法:使用了一些不合法的操作数:NaN数、无穷大数、求负数的平方根(这里不必考虑)。
2.除数为0(这里是加法器,所以不需要考虑)
3.上溢:当结果比最大浮点数还大时,处理上溢的方法有终止计算和饱和运算(用最大值作为结果)等
4.下溢:当结果比最小浮点数还小时,处理下溢的方法有将最小浮点数设为0或用一个小于 2^{E_{min}}^ 的非规格化数表示最小浮点数等方式处理。
5.结果不准确:当某个操作产生舍入错误时。
3、计算实例
由于IEEE标准下的浮点操作数已被表示为规格化形式,计算机在进行浮点加法时,为了对齐指数,计算机必须执行下面步骤:
第一步,找出指数较小的数
第二部,使两个数的指数相同
第三步,尾数相加
第四步,如果有必要,将结果规格化
以一个简单的8位尾数和一个未对齐的指数为例说明浮点运算,A = 1.0101001 × 24 , B=1.1001100×23,计算A+B
注意:
(1)因为IEEE754标准的32位单精度浮点数的指数与尾数位于位于同一个字中,所以在加法过程开始之前必须将它们分离开。
(2)如果两个指数的差大于p+1,p为尾数的位数,这里p=23,较小的数由于太小而无法影响较大的数,结果实际就等于较大的数。
(3)结果规格化时检查指数范围,以分别检测指数下溢或上溢。指数下溢会导致结果为0,而指数上溢出会造成错误。
浮点加法运算的流程图
4、舍入机制
浮点运算可能引起尾数位数的相加,需要保持尾数位数不变的方法。最简单的技术叫作截断。
比如将0.1101101截断为4位尾数的结果为0.1101。截断会产生诱导误差(即误差是由施加在数上的操作计算所引起的),诱导误差是偏差的,因为截断后的数总比截断数小。
舍入是一种更好的减少数的尾数的技术。如果舍弃的位的值大于剩余数的最低位的一半,将剩余数的最低位+1。
比如:
要找到中间值,先确定要保留的有效数字,找到要保留的有效数字最低位的下一位。如果这位是进制的一半,而且之后的位数都为 0,则这个值就是中间值。
舍入到最近的偶数例子:
十进制的 1.2500,要保留到小数点后一位,下一位是 5,是进制的一半,后面位数都为 0,所以这个值就是中间值
二进制的 10.0110,要保留到小数点后两位,下一位是 1,是进制的一半,后面位数都为 0,所以这个值就是中间值
知道了舍入规则之后(舍弃的位的值大于剩余数的最低位的一半),
看几个具体的例子,以二进制为例,有效位数保留到小数点后两位(保留两位数的话,0.xx1是余数的最低位的一半)。
10.00_011,中间值为 10.00100,小于中间值,向下舍入为 10.00
10.00_110,中间值为 10.00100,大于中间值,向上舍入为 10.01
10.11_100,中间值为 10.11100,等于中间值,要保留的最低有效位 1 为奇数,向上舍入为 11.00
10.10_100,中间值为 10.10100,等于中间值,要保留的最低有效位 0 为偶数,向下舍入为 10.10
舍入机制
(1)最简单的舍入机制是截断或向0舍入。
(2)向最近的数舍入:选择距离该数最近的那个浮点数作为结果。
(3)向正或负无穷大舍入:选择正或负无穷大方向上最近的有效浮点数作为结果。
(4)向偶数舍入:当要舍入的数位于两个连续浮点数的正中时,IEEE舍入机制选择最低位为0的点(即向偶数舍入)
详细信息见IEEE754标准中的4种舍入模式
舍入的规则需要区分三种情况:
当具体的值大于中间值的时候,向上舍入
当具体的值小于中间值的时候,向下舍入
当具体的值等于中间值的时候,向偶数舍入。向偶数舍入指的是要保留的最低有效位为偶数,具体规则:
要保留的最低有效位如果为奇数,则向上舍入
要保留的最低有效位如果为偶数,则向下舍入
扩展:乘除计算步骤
浮点乘法:
1.阶码相加
2.尾数相乘
3.规格化
4.判断溢出
浮点除法:
1.阶码相减
2.尾数相除
3.规格化
4.判断溢出
备注:该内容为读书笔记,部分内容与图片收集来源于网络,如有侵权或错误,请联系我整改,谢谢!