我正在尝试使用 IEEE-754 格式的按位运算符将两个 float 相乘。 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)sign1 × 2exp1 × mantissa1 * (-1)sign2 × 2exp2 × mantissa2
= (-1)sign1 + sign2 × 2exp1 + exp2 × mantissa1 × mantissa2
并且您不需要单独的变量来返回
Real Multiply(Real Val1, Real Val2){
Val1.fraction *= Val2.fraction;
Val1.exponent += Val2.exponent;
Val1.sign ^= Val2.sign;
return Val1;
}
在这些基本的事情之后,您仍然需要进行标准化,为此您需要获得完整的结果,而不是像正常的非扩展乘法那样仅获得低位。因此,您必须将“分数”(如果您使用的是 IEEE-754,那么正确的术语是有效数)转换为更广泛的类型。根据您所在的平台,您可能拥有也可能没有两倍于 unsigned long
的类型。在这种情况下,最好使用固定宽度类型,例如 int32_t
、uint64_t
。这就是执行此操作所需的所有提示
关于c++ - 将数字与按位运算符相乘时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54586205/