Fortran sqrt комплексного числа -1 дает разные результаты - PullRequest
0 голосов
/ 31 октября 2018

Этот код

print *, sqrt(cmplx(-1))
print *, sqrt(cmplx(-1,0))
print *, sqrt((-1,0))
print *, sqrt(-(1,0))

дает мне этот вывод

(0.00000000,1.00000000)
(0.00000000,1.00000000)
(0.00000000,1.00000000)
(0.00000000,-1.00000000)

Я считаю, что правильная алгебра - sqrt(-1)=i. Почему результат последней строки?

Версия компилятора - GCC 7.3.0, работающая в Linux openSUSE 42.2 (x86_64).

EDIT

После ответа @francescalus я пробовал больше случаев:

print *, sqrt((-1,-0))
print *, sqrt((-1,-0.))
print *, (-1,-0)
print *, (-1,-0.)

и я получаю

(0.00000000,1.00000000)
(0.00000000,-1.00000000)
(-1.00000000,0.00000000)
(-1.00000000,-0.00000000)

Итак, мой компилятор поддерживает отрицательные нули для real чисел. Поэтому, я думаю, важно соблюдать осторожность при работе с такими переменными:

complex             :: asd 
asd=(1.,0.)
print *, sqrt(-asd)

Здесь я снова получаю неправильный результат, но нулевую отрицательную вещь труднее предсказать. У меня так много вопросов! Вы знаете какой-нибудь другой пример, который может вызвать ошибку? У вас есть совет, чтобы избежать этих ошибок? Есть ли у вас флаг компилятора, чтобы отключить отрицательную поддержку cero для компилятора GCC?

1 Ответ

0 голосов
/ 31 октября 2018

Fortran 2008 (13.7.159) определяет результат функции sqrt для аргумента X как (мой акцент):

Результат имеет значение, равное зависящему от процессора приближению квадратного корня из X. Результатом типа complex является главное значение с действительной частью, большей или равной нулю. Когда действительная часть результата равна нулю, мнимая часть имеет тот же знак, что и мнимая часть X.

Ваши квадратные корни действительно имеют нулевую действительную часть, поэтому давайте посмотрим на знак мнимой части вашего аргумента. Каков знак мнимой составляющей -(1,0)? Если ваш процессор поддерживает нулевой знак, то он может быть отрицательным. В этом случае мнимая часть результата должна быть отрицательной в соответствии с требованием стандарта.

Во всех других случаях нет оснований ожидать, что мнимая составляющая аргумента будет отрицательной, а не положительной, равной нулю.

...