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

Bugs when multiplying numbers with bitwise operators

本文关键字:错误 数字 运算符      更新时间:2023-10-16

我正在尝试使用IEEE-754格式的按位运算符将两个浮点数相乘。32 位数字以符号 - 指数 - 尾数的形式组成。将每个数字相乘后,结果答案在某些时候是正确的,但不是所有时间都是正确的。

我认为这与结果答案不是规范化形式(例如 1.1010101 * 25(有关,但我不知道如何解决它。

#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(符号1 × 2exp1 ×尾数1 * (-1(符号2 × 2exp2 ×尾数2
= (-1(符号1 + 符号2 × 2exp1 + 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。这就是执行此操作所需的所有提示