二进制浮点数以及二进制浮点数算术运算 |
您所在的位置:网站首页 › 浮点数舍入处理是为了 › 二进制浮点数以及二进制浮点数算术运算 |
二进制浮点数以及二进制浮点数算术运算
二进制浮点数表示半精度浮点数单精度浮点数双精度浮点数特殊情况
浮点数的运算步骤一、对阶二、尾数运算三、结果规格化左规操作右规操作
四、 舍入处理五、 溢出判断六、例子二进制浮点数加法二进制浮点数减法二进制浮点数乘法二进制浮点数除法
浮点运算逻辑电路Reference
二进制浮点数表示
阶码(指数)就是指数位存储的值,而偏阶(移码)则不同精度的浮点数的偏阶也各不相同,具体可以查看指数偏差。 B i a s = 2 k − 1 − 1 Bias=2^{k-1}-1 Bias=2k−1−1, 其中k是指数中的位数。 半精度浮点数半精度浮点数 是一种被计算机使用的二进制浮点数据类型。半精度浮点数使用2个字节(16位)来存储。 在IEEE 754-2008中,它被称作binary16。这种数据类型只适合存储对精度要求不高的数字,不适合用来计算。 IEEE 754 标准指定了一个 binary16 要有如下的格式: Sign bit(符号位): 1 bit Exponent width(指数位宽): 5 bits Significand precision(尾数精度): 11 bits (有10位被显式存储) 按如下顺序排列: 除非指数位全是0,否则就会假定隐藏的起始位是1。因此只有10位尾数在内存中被显示出来,而总精度是11位。据IEEE 754的说法,虽然尾数只有10位,但是尾数精度是11位的(log10(211) ≈ 3.311 十进制数). 单精度浮点数单精度浮点数 格式是一种数据类型,在计算机存储器中占用4个字节(32 bits),利用“浮点”(浮动小数点)的方法,可以表示一个范围很大的数值。 第1位表示正负,中间8位表示指数,后23位储存有效数位(有效数位是24位)。 第一位的正负号0代表正,1代表负。 中间八位共可表示 2 8 = 256 2^8=256 28=256个数,指数可以是二补码;或0到255,0到126代表-127到-1,127代表零,128-255代表1-128。 有效数位最左手边的1并不会储存,因为它一定存在(二进制的第一个有效数字必定是1)。换言之,有效数位是24位,实际储存23位。 s i g n = + 1 sign = +1 sign=+1 e x p o n e n t = ( − 127 ) + 124 = − 3 exponent = (-127)+124=-3 exponent=(−127)+124=−3 f r a c t i o n = 1 + 2 − 2 = 1.25 fraction=1+2^{-2}=1.25 fraction=1+2−2=1.25 v a l u e = ( + 1 ) × 1.25 × 2 − 3 = + 0.15625 value=(+1)\times1.25\times2^{-3}=+0.15625 value=(+1)×1.25×2−3=+0.15625 双精度浮点数双精度浮点数(double)是计算机使用的一种资料类型。比起单精度浮点数,双精度浮点数(double)使用 64 位(8字节) 来存储一个浮点数。 它可以表示二进位制的53位有效数字,其可以表示的数字的绝对值范围为 [ 2 − 1024 , 2 1024 ] [2^{-1024}, 2^{1024}] [2−1024,21024]。 特殊情况以双精度浮点数为例,说明一些特殊情况 当指数exponent全为0或者全为1时,有特殊含义,有以下四种情况, 1、 e x p o n e n t = 0 , f r a c t i o n = 0 ⇒ ± 0 exponent=0, fraction=0 \Rightarrow \pm0 exponent=0,fraction=0⇒±0 2、 e x p o n e n t = 0 , f r a c t i o n ≠ 0 ⇒ 非 正 规 形 式 的 浮 点 数 exponent=0, fraction\neq0 \Rightarrow 非正规形式的浮点数 exponent=0,fraction=0⇒非正规形式的浮点数 3、 e x p o n e n t = 2047 , f r a c t i o n = 0 ⇒ ± ∞ exponent=2047, fraction=0 \Rightarrow \pm\infty exponent=2047,fraction=0⇒±∞ 4、 e x p o n e n t = 2047 , f r a c t i o n ≠ 0 ⇒ N a N exponent=2047, fraction\neq0 \Rightarrow NaN exponent=2047,fraction=0⇒NaN 浮点数的运算步骤浮点数的加减运算一般由以下五个步骤完成:对阶、尾数运算、规格化、舍入处理、溢出判断 一、对阶所谓对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目的是为使两个浮点数的尾数能够进行加减运算。因为,当进行 M x ⋅ 2 E x M_x·2^{E_x} Mx⋅2Ex与 M y ⋅ 2 E y M_y·2^{E_y} My⋅2Ey加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。对阶的具体方法是:首先求出两浮点数阶码的差,即 Δ E = E x − E y \Delta E = E_x - E_y ΔE=Ex−Ey,将小阶码加上 Δ E \Delta E ΔE,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移相应位数,以保证该浮点数的值不变。几点注意: (1)对阶的原则是小阶对大阶,之所以这样做是因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。 (2)若 Δ E \Delta E ΔE=0,说明两浮点数的阶码已经相同,无需再做对阶操作了。 (3)采用补码表示的尾数右移时,符号位保持不变。 (4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。 二、尾数运算尾数运算就是进行完成对阶后的尾数相加减。这里采用的就是我们前面讲过的纯小数的定点数加减运算。 三、结果规格化在机器中,为保证浮点数表示的唯一性,浮点数在机器中都是以规格化形式存储的。对于IEEE754标准的浮点数来说,就是尾数必须是1.M的形式。由于在进行上述两个定点小数的尾数相加减运算后,尾数有可能是非规格化形式,为此必须进行规格化操作。 规格化操作包括左规和右规两种情况。 左规操作将尾数左移,同时阶码减值,直至尾数成为 1. M 1.M 1.M的形式。例如,浮点数 0.0011 ∗ 2 5 0.0011*2^5 0.0011∗25是非规格化的形式,需进行左规操作,将其尾数左移3位,同时阶码减3,就变成 1.1100 ∗ 2 2 1.1100*2^2 1.1100∗22规格化形式了。 右规操作将尾数右移1位,同时阶码增1,便成为规格化的形式了。要注意的是,右规操作只需将尾数右移一位即可,这种情况出现在尾数的最高位(小数点前一位)运算时出现了进位,使尾数成为 10. x x x x 10.xxxx 10.xxxx或 11. x x x x 11.xxxx 11.xxxx的形式。例如, 10.0011 ∗ 2 5 10.0011*2^5 10.0011∗25右规一位后便成为 1.00011 ∗ 2 6 1.00011*2^6 1.00011∗26的规格化形式了。 四、 舍入处理浮点运算在对阶或右规时,尾数需要右移,被右移出去的位会被丢掉,从而造成运算结果精度的损失。为了减少这种精度损失,可以将一定位数的移出位先保留起来,称为保护位,在规格化后用于舍入处理。 IEEE754标准列出了四种可选的舍入处理方法: (1)就近舍入(round to nearest)这是标准列出的默认舍入方式,其含义相当于我们日常所说的“四舍五入”。例如,对于32位单精度浮点数来说,若超出可保存的23位的多余位大于等于 100 … 01 100…01 100…01,则多余位的值超过了最低可表示位值的一半,这种情况下,舍入的方法是在尾数的最低有效位上加1;若多余位小于等于 011 … 11 011…11 011…11,则直接舍去;若多余位为 100 … 00 100…00 100…00,此时再判断尾数的最低有效位的值,若为0则直接舍去,若为1则再加1。 (2)朝 + ∞ +∞ +∞舍入(round toward + ∞ +∞ +∞)对正数来说,只要多余位不为全0,则向尾数最低有效位进1;对负数来说,则是简单地舍去。 (3)朝 − ∞ -∞ −∞舍入(round toward − ∞ -∞ −∞)与朝 + ∞ +∞ +∞舍入方法正好相反,对正数来说,只是简单地舍去;对负数来说,只要多余位不为全0,则向尾数最低有效位进1。 (4)朝0舍入(round toward 0) 即简单地截断舍去,而不管多余位是什么值。这种方法实现简单,但容易形成累积误差,且舍入处理后的值总是向下偏差。 五、 溢出判断与定点数运算不同的是,浮点数的溢出是以其运算结果的阶码的值是否产生溢出来判断的。若阶码的值超过了阶码所能表示的最大正数,则为上溢,进一步,若此时浮点数为正数,则为正上溢,记为 + ∞ +∞ +∞,若浮点数为负数,则为负上溢,记为 − ∞ -∞ −∞;若阶码的值超过了阶码所能表示的最小负数,则为下溢,进一步,若此时浮点数为正数,则为正下溢,若浮点数为负数,则为负下溢。正下溢和负下溢都作为0处理。 要注意的是,浮点数的表示范围和补码表示的定点数的表示范围是有所不同的,定点数的表示范围是连续的,而浮点数的表示范围可能是不连续的。 六、例子f l o a t a = 0.3 ; b = 1.6 float \ \ \ \ a=0.3;b=1.6 float a=0.3;b=1.6; a = ( 0.3 ) 10 = ( 0011 1110 1001 1001 1001 1001 1001 1010 ) 2 a=(0.3)_{10}=(0011\ 1110\ 1001\ 1001\ 1001\ 1001\ 1001\ 1010)_2 a=(0.3)10=(0011 1110 1001 1001 1001 1001 1001 1010)2 S a = 0 E a = 011 1110 1 M a = 1.001 1001 1001 1001 1001 1010 S_a=0\ \ \ \ E_a=011\ 1110\ 1\ \ \ \ M_a=1.001\ 1001\ 1001\ 1001\ 1001\ 1010 Sa=0 Ea=011 1110 1 Ma=1.001 1001 1001 1001 1001 1010 b = ( 1.6 ) 10 = ( 0011 1111 1100 1100 1100 1100 1100 1101 ) 2 b=(1.6)_{10}=(0011\ 1111\ 1100\ 1100\ 1100\ 1100\ 1100\ 1101)_2 b=(1.6)10=(0011 1111 1100 1100 1100 1100 1100 1101)2 S b = 0 E b = 011 1111 1 M b = 1.100 1100 1100 1100 1100 1101 S_b=0\ \ \ \ E_b=011\ 1111\ 1\ \ \ M_b=1.100\ 1100\ 1100\ 1100\ 1100\ 1101 Sb=0 Eb=011 1111 1 Mb=1.100 1100 1100 1100 1100 1101 a + b = ? a+b=? a+b=? 二进制浮点数加法第一步:对阶 ∵ E a < E b E b − E a = 2 ∵ E_a < E_b\ \ \ E_b-E_a=2 ∵Ea |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |