2015-03-23 2 views
2

Существует ли функция абсолютного значения для комплексного значения в двойной точности? Когда я пытаюсь CABS() яФункция CABS (x) для комплекса (8)

  V(1,j) = R(j,j) + (R(j,j)/cabs(R(j,j)))*complexnorm2(R(j:m,j)) 

"Error: Type of argument 'a' in call to 'cabs' at (1) should be COMPLEX(4), not COMPLEX(8)"

Я прочитал, что есть функция называется CDABS(), но я не был уверен, если это было то же самое?

ответ

5

Нет причин использовать ничего, кроме ABS(). Дженерики для внутренних процедур уже присутствовали в FORTRAN 77. Вы можете использовать их для всех внутренних числовых типов.

Если вы хотите увидеть таблицу доступных конкретных функций генератора ABS(), см. https://gcc.gnu.org/onlinedocs/gfortran/ABS.html, но они в основном полезны только для передачи в качестве фактических аргументов. Вы можете видеть, что CDABS() является нестандартным расширением, и я не рекомендую его использовать.

+0

спасибо Vladimir – malonej

2

CABS определяется стандартом для принятия аргумента типа по умолчанию. В вашей реализации это выглядит как complex(kind=4). Нет стандартной функции CDABS, хотя ваша реализация может, возможно, предложить ее: прочитайте соответствующую документацию.

Кроме того, нет стандартной конкретной функции для общей функции ABS, которая принимает аргумент double complex. Опять же, ваша реализация может предложить один вызов, который называется чем-то иным, чем CDABS.

При этом общая функция ABS принимает любой целочисленный, вещественный или сложный аргумент. Используйте это.

+0

Спасибо, Francescalus, слишком низкий уровень для голосования, иначе я бы – malonej

0

КОМПЛЕКС * 8 и комплекс (KIND = 8) не совпадают. Первый, 4 байта реального и 4 байта мнимой.

Комплекс (KIND = 8) или COMPLEX (KIND = C_DOUBLE) на самом деле представляет собой двумерную реальную и двойную точность мнимой ... Так что эквивалентно COMPLEX * 16.

Как упоминалось, ABS() должно быть хорошо.

+1

'complex * 8' вообще не появляется. Но в любом случае «complex * 8» не является Fortran, состоящим из двух 4-байтных компонентов: это нестандартное расширение, определенное некоторыми компиляторами. Точно так же 'complex (8)' может означать что угодно/ничего. 'complex * 16', если это означает, что все может быть полностью отличным от' complex (8) 'и' complex (c_double) '. – francescalus

+0

Именно поэтому я разместил это @francescalus ... Легко найти (или наткнуться) код, который выглядит так ... И легко обернуться вокруг оси. – Holmz

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