c ++从复杂中得到负数

时间:2016-09-06 21:03:17

标签: c++ complex-numbers

如果我创建一个带有幅度negativ(-1)且没有相位(0)的复数,因此对应于-1的double,并将其转换回幅度和相位,幅度不是负的

complex<double> c;
c = polar(-1.0, 0.0);
cout << c << ", " << abs(c) << ", " << arg(c) << endl;

输出

(-1, 0), 1, -3.14159

应该是

(-1, 0), -1, 0

如何找回正确的幅度值?

2 个答案:

答案 0 :(得分:3)

从数学的角度来看,复数的幅度(或模数绝对值)应为正数(或0)。

查看std::polar的参考页面,它指定了:

  

返回幅度为r且相角θ为的复数。该   如果r为负数或NaN,或者如果θ为无穷大,则行为未定义     (自C ++ 17起)

您没有指定正在使用的编译器,但它足以为您提供“正确”的结果,即数字1和相位角-π的复数。 用g ++ 6.1测试相同的片段(-std = c ++ 14)给了我:

(-1,-0), 1, -3.14159

唯一的区别是负零,这与负角度一致。

另请注意,std::abs这样的函数只有在发生错误时才会返回负数。

答案 1 :(得分:1)

你将真实和想象的部分与绝对和阶段混淆。

尝试:

cout << c << ", " << real(c) << ", " << imag(c) << endl;

此外,绝对值绝不能为负by definition of polar coordinates。你可以尝试:

complex<double> c;
c = polar(1.0, M_PI); //don't forget to include <cmath>
cout << c << ", " << abs(c) << ", " << arg(c) << endl;

这将翻转相位并使极坐标的另一个方向上的半径。