std :: complex的运算符*返回的答案不同于复数乘法的手动公式

问题描述

我正在运行以下代码

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);

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 s中时,结果不会被截断。

您可以通过周围使用complex<int32_t>的值来解决此问题,也可以使用complex<int32_t> s来进行乘法:

result = complex<int32_t>(num1) * complex<int32_t>(num2)
,

您的输入为int16_t,因此您很可能会溢出,因为结果也将为int16_t。只有在计算出结果之后,它才会转换为int32_t

如果将输入更改为std::complex<int32_t>,结果将是正确的。