现实中的科学计数乘除
计 算 1.234 × 1 0 2 + 5.678 × 1 0 1 = ? 计算1.234\times10^{2}+5.678\times10^{1}=? 计算1.234×102+5.678×101=?
- 1.234 × 5.678 = 7.006652 1.234\times5.678=7.006652 1.234×5.678=7.006652
- 2 + 1 = 3 2+1=3 2+1=3
- 7.006652 × 1 0 3 = 7.01 × 1 0 3 7.006652\times10^{3}=7.01\times10^{3} 7.006652×103=7.01×103
我们总结下来就是尾数相乘除,指数相加减。
机器中的过程
求阶
由于阶码是用移码表示的,所以求阶的过程就是求移码的和或差。
移码运算参考
使用以下公式进行阶码的加减,这里的偏置常数是(2n-1-1)
- [ A + B ] 移 = [ A ] 移 + [ B ] 移 − ( 2 n − 1 − 1 ) [A+B]_{移}=[A]_{移}+[B]_{移}-(2^{n-1}-1) [A+B]移=[A]移+[B]移−(2n−1−1)
- [ A − B ] 移 = [ A ] 移 − [ B ] 移 + ( 2 n − 1 − 1 ) [A-B]_{移}=[A]_{移}-[B]_{移}+(2^{n-1}-1) [A−B]移=[A]移−[B]移+(2n−1−1)
示例1:(-1)+(-2)
将阶码用移码表示:(加偏置常数127)
(
−
1
)
10
+
(
127
)
10
=
(
126
)
移
=
(
01111110
)
2
(-1)_{10}+(127)_{10}=(126)_{移}=(0111 1110)_{2}
(−1)10+(127)10=(126)移=(01111110)2
( − 2 ) 10 + ( 127 ) 10 = ( 125 ) 移 = ( 01111101 ) 2 (-2)_{10}+(127)_{10}=(125)_{移}=(0111 1101)_{2} (−2)10+(127)10=(125)移=(01111101)2
( 127 ) 10 = ( 01111111 ) 补 (127)_{10}=(0111 1111)_{补} (127)10=(01111111)补
( − 127 ) 10 = ( 10000001 ) 补 (-127)_{10}=(1000 0001)_{补} (−127)10=(10000001)补
求阶:(阶码相加,减127)
01111110
+
01111101
+
10000001
=
01111100
0111 1110+0111 1101+1000 0001=0111 1100
01111110+01111101+10000001=01111100
结果:
[
01111100
]
移
=
124
[0111 1100]_{移}=124
[01111100]移=124
124
−
127
=
−
3
124-127=-3
124−127=−3(减去偏置常数)
示例2:(-1)-(-2)
因为是减-2,所以求-2的变补码:
(
01111101
)
变
补
=
10000011
(0111 1101)_{变补}=1000 0011
(01111101)变补=10000011
求阶:(阶码相减,加127)
01111110
+
10000011
+
01111111
=
10000000
0111 1110+1000 0011+0111 1111=1000 0000
01111110+10000011+01111111=10000000
结果:
[
10000000
]
移
=
128
[10000000]_{移}=128
[10000000]移=128
128
−
127
=
1
128-127=1
128−127=1(减去偏置常数)
尾数乘除
由于尾数是用原码表示的,所以需要知道原码的乘除运算:
原码乘参考
原码除参考
结果规格化(同浮点数加减)
- 当尾数高位为0需左归:每左移一次,阶码减一,直到MSB(最高有效位)为1。(小数点右移,指数变小)
- 当尾数最高位有进位,需右归:每右移一次,阶码加一,直到MSB为1。
- 每次阶码变化,都需要判断阶码是否上溢或下溢。阶码上溢时异常处理,下溢时结果为0。
阶码溢出判断
上溢表示阶码值过大,下溢表示阶码值过小。
- 左规时(尾数左移,阶码减1)
先判断阶码是否全0,若是,则阶码下溢。否则,阶码减1后判断是否全为0,若是则阶码下溢。 - 右规时(尾数右移,阶码加1)
先判断阶码是否全1,若是,则阶码上溢。否则,阶码加1后判断是否全为1,若是则阶码上溢。
4种特殊情况的溢出
设Ex,Ey是两位阶码,Eb是Ex与Ey运算的结果:
- Eb全为1则上溢,Eb全为0则下溢。
- Eb=Ex+Ey
- 若Ex,Ey最高位都是1,且Eb的最高位是0,则阶码上溢。(
正数加正数是负数) - 若Ex,Ey最高位都是0,且Eb的最高位是1,则阶码下溢。(
负数加负数是正数)
- 若Ex,Ey最高位都是1,且Eb的最高位是0,则阶码上溢。(
- Eb=Ex-Ey
- 若Ex最高位是1,Ey最高位是0,且Eb的最高位是0,则阶码上溢。(
正数减负数是负数) - 若Ex最高位是0,Ey最高位是1,且Eb的最高位是1,则阶码下溢。(
负数减正数是正数)
- 若Ex最高位是1,Ey最高位是0,且Eb的最高位是0,则阶码上溢。(
舍入(同浮点数加减)
浮点数加减的舍入
尾数代表的实际值是0,则将阶码置0。(因为浮点数表示0的格式原因)