Этот код
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?