我想乘用位运算符在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)×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
在这种情况下。这是要做到这一点所需的所有提示