2016-09-06 2 views
-3

Если я создаю комплексное число с амплитудным отрицанием (-1) и без фазы (0), что соответствует удвоению -1 и преобразует его обратно в амплитуду и фазу, амплитуда не отрицательнаC++ получить отрицательные числа из комплекса

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 

Как я могу получить BAC k правильное значение амплитуды?

+1

полярный (-1.0,0.0) => -180 градусов аргумент, 1 радиус. Радиус не может быть отрицательным. –

+2

Вы знаете, что отображение (rho, theta) - (abs, arg) не является строго биективным? – vaxquis

+0

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

ответ

3

С математической точки зрения, величина (или модуль или абсолютное значение) комплексного числа должно быть положительное число (или 0).

Глядя на справочной странице std::polar это указано, что:

Возвращает комплексное число с величиной г и фазового угла тета. поведение не определено, если г отрицателен или NaN, или, если тэта бесконечна (с C++ 17)

Вы не указали, какой компилятор вы используете, но достаточно любезен, чтобы дать вам «правильный» результат, комплексное число с магнитудой 1 и фазовым углом -π. Тестирование тот же фрагмент с G ++ 6.1 (-std = C++ 14) дал мне:

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

Единственное отличие является отрицательным нулем, что согласуется с отрицательным углом.

Также обратите внимание, что функция типа std::abs может возвращать отрицательное число только в случае возникновения некоторой ошибки.

+0

Действительно, я вводил в заблуждение величину, определяемую нормой с физической амплитудой, которая может быть отрицательной (по определению). –

1

Вы вводите в заблуждение реальную и мнимую часть с абсолютной и фазой.

Try:

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; 

И переворачивает фазу и сделать радиус на другом направлении полярных координат.

Смежные вопросы