IEEE 754 浮点数加减运算

电子科技大学 - 计算机组成原理

小数的十进制和二进制转换

移码

定义:[X] = X + 2n ( -2n ≤ X < 2n )
X为真值,n为整数的位数

数值位和X的补码相同,符号位与补码相反

舍入方法

0舍1入

保留4位尾数:
0 00100 -> 0 0010
/*
**0直接舍去
*/
1 00101 -> 1 0011
/*
**1进位
*/
1 11011 -> 1 1110

末位恒置1

保留4位尾数:
0 00100 -> 0 0011
1 00101 -> 1 0011
1 11011 -> 1 1101

IEEE 754

32位单精度

Sign 8位阶码 [偏移量为28-1-1 = 127的非标准移码] 23位尾数
真值表达式 E的取值范围
N = (-1)s × 2E-127 × 1.M 1到254

64位双精度

Sign 11位阶码 [偏移量为211-1-1 =1023的非标准移码] 252位尾数
真值表达式 E的取值范围
N = (-1)s × 2E-1023 × 1.M 1到2046

为了确保浮点数表示的唯一性,约定 0 ≤ M < 1

各字段的含义( 以单精度为例 )

规范浮点数

1 ≤ E ≤ 254

真值表达式:N = (-1)s × 2E-127 × 1.M,尾数部分隐含开头的1

  • 最小的正规格化数
0 0000 0001 0000 0000 0000 0000 0000 000
  • 最大的正规格化数
0 1111 1110 1111 1111 1111 1111 1111 111

非规范浮点数

E = 0,M ≠ 0

s 0000 0000 ≠ 0
真值表达式:N = (-1)s × 2-126 × 0.M,尾数部分不隐含开头的1

最小的正非规格化数

s 0000 0000 0000 0000 0000 0000 0000 001

最大的正非规格化数

s 0000 0000 1111 1111 1111 1111 1111 111

浮点数0

E = 0,M = 0

s 0000 0000 0000 0000 0000 0000 0000 000
有+0.0和-0.0两种零

无穷大

E全为1(255),M = 0

正无穷大

0 1111 1111 0000 0000 0000 0000 0000 000

负无穷大

1 1111 1111 0000 0000 0000 0000 0000 000

NaN Not a Number

计算sqrt(-1)或∞-∞时会返回NaN

E全为1(255),M ≠ 0

s 1111 1111 ≠ 0

为什么要使用127作为偏移量而不是128

在这里插入图片描述
https://stackoverflow.com/questions/8909841/why-does-the-ieee-754-standard-use-a-127-bias

溢出

上溢:阶码大于机器的最大阶码,不能继续运算,一般要进行中断处理

下溢:阶码小于最小阶码,当做零处理,机器可以继续运算

规格化浮点数

  • 当尾数结果为00.0x...x 或 11.1x...x
    尾数左移,阶码减1,直到尾数形式为00.1x...x 或 11.0x...x

  • 当尾数结果为01.x...x 或 10.x...x
    尾数右移,阶码加1,尾数形式变为00.1x...x 或 11.0x...x

阶码加减

设:
AE、BE为阶码,CE为结果阶码

[ AE + BE ]
= ( AE + BE ) + 127
= ( AE + 127 ) + ( BE + 127 ) - 127
= [ AE ] + [ BE ] -127
= [ AE ] + [ BE ] + [ -127 ]
= [AE] + [BE] + 129

= ( [AE] + [BE] + 129 ) mod 28

[ AE - BE ]
= ( AE - BE ) + 127
= ( AE + 127 ) - ( BE + 127 ) + 127
= [ AE ] - [ BE ] + 127

= ( [AE] - [BE] + 127 ) mod 28

浮点数加减

设:
A = 2AE × AM,B = 2BE × BM
AE、BE为阶码,AM、BM为尾数

在这里插入图片描述

舍入

右移时:

  • 0舍1入
  • 末位恒置1

例题

x = 0.5, y = 0.4375, 32位单精度表示,求x + y和x - y

转换为二进制

  1. 0.5 x 2 = 1.0 取1

0.1 → 1.0 x 2 -1
[x] =

0 0111 1110 0000 0000 0000 0000 0000 000
-1 + 127 = 126
  1. 0.4375 x 2 = 0.875 取0
  2. 0.8750 x 2 = 1.750 取1
  3. 0.7500 x 2 = 1.500 取1
  4. 0.5000 x 2 = 1.000 取1

-0.0111 → 1.11 x 2-2

[y] =

1 0111 1101 1100 0000 0000 0000 0000 000
-2 + 127 = 125

求阶差

(0111 1110 - 0111 1101 + 127)mod 28 = 1
y向x对齐
y = 0.111 x 2-1
[y] =

1 0111 1110 1110 0000 0000 0000 0000 000

尾数加减

+
00.0000 0000 0000 0000 0000 000
00.0010 0000 0000 0000 0000 000
00.0010 0000 0000 0000 0000 000
结果为00.0x...x,左规
得到1.0... x 2-4

结果 = 0.0625

0 0111 1011 0000 0000 0000 0000 0000 000
-4 + 127 = 123
-
00.0000 0000 0000 0000 0000 000
00.1110 0000 0000 0000 0000 000
00.1110 0000 0000 0000 0000 000

结果 = 0.9345

0 0111 1110 1110 0000 0000 0000 0000 000
posted @ 2020-04-22 23:23  LanceHansen  阅读(1241)  评论(0编辑  收藏  举报