std::complex returns 的运算符* 与手动复数乘法公式的答案不同
operator* of std::complex returns different answer than manual formula of complex number multiplication
我是运行以下代码:
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
我的问题是,为什么复数相乘公式 returns 与运算符*(std::complex 类型)的结果不同?
你的复数是complex<int16_t>
类型的,意思是实部和虚部都是16位。它们相乘的结果也必须有 16 位的实部和虚部。这发生在您将结果存储到 complex<int32_t>
.
之前
当您自己进行乘法时,16 位值首先被转换为 int
s(在您的系统上可能是 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>
,结果将是正确的。
我是运行以下代码:
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
我的问题是,为什么复数相乘公式 returns 与运算符*(std::complex 类型)的结果不同?
你的复数是complex<int16_t>
类型的,意思是实部和虚部都是16位。它们相乘的结果也必须有 16 位的实部和虚部。这发生在您将结果存储到 complex<int32_t>
.
当您自己进行乘法时,16 位值首先被转换为 int
s(在您的系统上可能是 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>
,结果将是正确的。