c++ - 将数字与按位运算符相乘时的错误

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

我正在尝试使用 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_tuint64_t。这就是执行此操作所需的所有提示

关于c++ - 将数字与按位运算符相乘时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54586205/

相关文章:

java - 这两种说法有什么区别吗?

c++ - 通过文本文件往返的 float 校验和

c - 哪种有符号整数除法对应位移位?

java - 在位置 0 处插入字节并右移剩余数据位

c++ - CUDA channel ID 与基于 threadIdx.x 的计算

c++ - 如何释放 libjpeg 创建的缓冲区?

c++ - 使用 LibAV : avcodec_decode_video2? 将压缩帧解码到内存

c++ - 删除字符串中分隔符之间的字符

mysql - mysql中的舍入 float 有什么问题?

基于角度的 C++ SDL 碰撞