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
转换为二进制
- 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 |
- 0.4375 x 2 = 0.875 取0
- 0.8750 x 2 = 1.750 取1
- 0.7500 x 2 = 1.500 取1
- 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 |
---|