我正在运行以下代码:
complex<int16_t> num1 (953, -20068);
complex<int16_t> num2 (953, -20068);
complex<int32_t> result;
result = num1*num2;
std::cout << to_string(result.real()) << "+" << to_string(result.imag()) << "i"<< std::endl;
我得到以下结果:-15199+23416i
但是,如果我根据复数的乘法公式计算乘法:complex<int16_t> num1 (953, -20068);
complex<int16_t> num2 (953, -20068);
int32_t A = ((num1.real())*(num2.real()))-((num1.imag())*(num2.imag()));
int32_t B = ((num1.real())*(num2.imag()))+((num2.real())*(num1.imag()));
std::cout << to_string(A) << to_string(B) << "i"<< std::endl;
我得到以下结果:-401816415-38249608i
我的问题是,为什么将复数相乘的公式返回的结果与运算符*(类型为std::complex)的结果不同? 最佳答案
您的复数类型为complex<int16_t>
,这意味着实部和虚部均为16位。将它们相乘的结果还必须具有16位的实部和虚部。在将结果存储到complex<int32_t>
之前,会发生这种情况。
自己进行乘法运算时,首先将16位值转换为int
(在您的系统上可能为32位)。因此,将结果放入int32_t
时,结果不会被截断。
您可以通过周围使用complex<int32_t>
值或使用complex<int32_t>
进行乘法来解决此问题:
result = complex<int32_t>(num1) * complex<int32_t>(num2)
关于c++ - std::complex的运算符*返回的答案不同于复数乘法的手动公式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64338975/