乘以位运算数字时错误

问题描述 投票:3回答:1

我想乘用位运算符在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;
}
c++ floating-point bit-manipulation multiplication
1个回答
4
投票

虽然乘以尾数部分必须乘在一起,不加

(-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_tuint64_t在这种情况下。这是要做到这一点所需的所有提示

© www.soinside.com 2019 - 2024. All rights reserved.