我正在尝试使用IEEE-754格式的按位运算符将两个浮点数相乘。 32位数字以符号-指数-尾数的形式组成。将每个数字相乘后,得到的答案在某些时间是正确的,但并非在所有时间都是正确的。
我认为这与所得到的答案不是规范化形式有关(例如1.1010101 * 2 5 ),但我不知道如何解决。
#include <csdtdio>
struct Real
{
int sign;
long exponent;
unsigned long fraction;
};
Real Multiply(Real Val1, Real Val2){
Real answer;
answer.fraction = left.fraction + right.fraction;
answer.exponent = left.exponent + right.exponent;
answer.sign = left.sign ^ right.sign;
return answer;
}
答案 0 :(得分:4)
在将尾数相乘时,必须相乘而不是相加
(-1) sign1 ×2 exp1 ×尾数1 *(-1) sign2 ×2 exp2 ×尾数2
=(-1) sign1 + sign2 ×2 exp1 + exp2 ×尾数1×尾数2
并且您不需要单独的变量来返回
Real Multiply(Real Val1, Real Val2){
Val1.fraction *= Val2.fraction;
Val1.exponent += Val2.exponent;
Val1.sign ^= Val2.sign;
return Val1;
}
在完成了这些基本操作之后,您仍然必须进行归一化,为此您需要获得完整的结果,而不是像普通的非扩展乘法那样仅获得低位。因此,您必须将“分数”(如果使用的是IEEE-754,则正确的术语为“ significand ”)转换为更大的类型。根据所用平台的不同,类型的大小可能为unsigned long
的两倍。在这种情况下,最好使用固定宽度类型,例如int32_t
,uint64_t
。这就是完成此操作所需的所有提示