使用按位运算符将数字相乘时的错误

时间:2019-02-08 05:00:16

标签: c++ floating-point bit-manipulation multiplication

我正在尝试使用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;
}

1 个答案:

答案 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_tuint64_t。这就是完成此操作所需的所有提示