使用按位运算符将数字相乘时的错误
Bugs when multiplying numbers with bitwise operators
我正在尝试使用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_t
,uint64_t
。这就是执行此操作所需的所有提示
相关文章:
- 输出错误,问题是找到总和5000位数字cpp
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 错误含义;以二进制形式打印数字
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 我如何在一个 if 语句中声明所有数字我尝试通过其他方式声明所有数字,如果一个接一个,但似乎代码有逻辑错误
- 分布MPI散点错误的数字
- 涉及模运算符优先级的错误以及C++中具有大数字的括号
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- 为什么C++显示错误的数字?
- 错误:数字常量 #define BOOT_PROTOCOL 0x00 之前的预期'>'
- 我的代码似乎在查找最大数字时存在语法错误
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- C++:按数字排序链表错误
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 一个数字的提升精神解析器的分段错误
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- C++数组中的错误数字
- 构造函数错误:错误:数字常量之前的预期“”,“”或“..”
- [错误]数字常量之前的预期标识符.-setlocale
- 错误:“数字”之前的预期类型说明符