如果我创建一个带有幅度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
如何找回正确的幅度值?
答案 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;
这将翻转相位并使极坐标的另一个方向上的半径。