浮点数计算特点是阶码和尾数分开计算
根据假设条件/给定条件:
🎈一般默认阶码和尾数都是用补码来表示
使得两个操作数的小数点位置对齐
步骤:
设两个规格化浮点数(强调规格化是为了便于讨论)为:(书面书写,就不必使用严格的机器标准IEEE 754)
a = E a S a a=E_aS_a a=EaSa
b = E b S b b=E_bS_b b=EbSb
设
E
a
<
E
b
设E_a
基数默认为2,浮点数的阶码和尾数分别用E,S表示
求阶差 δ \delta δ
然后小阶向大阶看齐
类似于十进制(真值)的四舍五入
只有右归(末尾(若干)小数)被移丢时,才有考虑舍入的必要(有意义)
基本原理是,补码函数C(x)在正数区间和负数区间内部:
假设某个求和结果 : ( x − y ) 补 = 11 , 00 ; 10.110001 根据双符号位的性质 , 上述结果是一个溢出 ( 负溢出 ) 值 需要进行右归 ( x − y ) 补 = 11 , 00 ; 11.011000 1 ♣ ( 注意 , 溢出的双符号位在右移时 , 只有低位参与右移 , 并将缺失的低位符号用高位符号补位 , 得到不溢出的结果 ) 现在发现被右移操作移出去的 ( 最高 ) b i t 是 1 , 于是根据 0 舍 1 入 , 对其进行末尾数码 + 1 处理 11.011000 + 1 11.011001 所以 ( x − y ) 补 = 11 , 00 ; 11.011001 假设某个求和结果: \\(x-y)_补=11,00;10.110001 \\根据双符号位的性质,上述结果是一个溢出(负溢出)值 \\需要进行右归 \\(x-y)_补=11,00;11.011000\ \underset{\clubsuit} 1 \\(注意,溢出的双符号位在右移时,只有低位参与右移, \\并将缺失的低位符号用高位符号补位,得到不溢出的结果) \\现在发现被右移操作移出去的(最高)bit是1,于是根据0舍1入, \\对其进行末尾数码+1处理 \\ \begin{aligned} &&11.011000& \\&+&1& \\\hline &&11.011001& \end{aligned} \\所以(x-y)_补=11,00;11.011001 假设某个求和结果:(x−y)补=11,00;10.110001根据双符号位的性质,上述结果是一个溢出(负溢出)值需要进行右归(x−y)补=11,00;11.011000 ♣1(注意,溢出的双符号位在右移时,只有低位参与右移,并将缺失的低位符号用高位符号补位,得到不溢出的结果)现在发现被右移操作移出去的(最高)bit是1,于是根据0舍1入,对其进行末尾数码+1处理+11.011000111.011001所以(x−y)补=11,00;11.011001
x = 0.1101 × 2 01 y = ( − 0.1010 ) × 2 11 两个数的阶码和尾数均以补码形式保存 除了基数 2 , 其余数都是二进制形式 2 个浮点数的补码 : ( 为了便于判断溢出 , 阶码和尾数都采用双符号位形式 ) 以分号分割阶码和尾数 ; E 或者 j 表示阶码 ; S 表示尾数 C ( x ) = 00 , 01 ; 00.1101 C ( y ) = 00 , 11 ; 11 , 0110 x=0.1101\times{2^{01}} \\y=(-0.1010)\times{2^{11}} \\两个数的阶码和尾数均以补码形式保存 \\除了基数2,其余数都是二进制形式 \\\\ 2个浮点数的补码:(为了便于判断溢出,阶码和尾数都采用双符号位形式) \\以分号分割阶码和尾数;E或者j表示阶码;S表示尾数 \\C(x)=00,01;00.1101 \\C(y)=00,11;11,0110 x=0.1101×201y=(−0.1010)×211两个数的阶码和尾数均以补码形式保存除了基数2,其余数都是二进制形式2个浮点数的补码:(为了便于判断溢出,阶码和尾数都采用双符号位形式)以分号分割阶码和尾数;E或者j表示阶码;S表示尾数C(x)=00,01;00.1101C(y)=00,11;11,0110
对阶
基于原码的规格化数(单符号位)
由于浮点数尾数的小数点均固定在第一数值位前,所以尾数的加减运算规则与定点数的完.全相同。
但由于其阶码的大小
又直接反映尾数有效值小数点的实际位置
,
(1) 对阶,使两数的小数点位置对齐。(阶数决定小数点实际位置)
阶差
,再按小阶向大阶看齐
的原则,使阶小的尾数
向右移
位,
(2) 尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)
(3) 规格化,为增加有效数字的位数,提高运算精度,必须将求和 (差)后的尾数规格化。
(4) 舍入,为提高精度,要考虑尾数右移时丢失的数值位。
(5) 溢出判断, 即判断结果是否溢出
x
=
S
x
⋅
r
j
x
y
=
S
y
⋅
r
j
y