Как установить мнимую часть комплексного числа на ноль? - PullRequest
4 голосов
/ 16 марта 2012

Мне нужно проверить, является ли мнимая часть очень маленькой, и установить ее на ноль, если это необходимо для устранения некоторых ошибок с плавающей запятой, которые приводят к очень маленьким ненулевым мнимым частям, когда она должна быть нулевой.1002 * Мой код выглядит следующим образом:

kz2 = SQRT((n2*(2.0*PI*eta))**2 - kxarray(p)**2)
kz1 = SQRT((n1*(2.0*PI*eta))**2 - kxarray(p)**2)

if (aimag(kz2) < 0.0005) then
    kz2 = (REAL(kz2),0.0)
end if

if (aimag(kz1) < 0.0005) then
    kz1 = (REAL(kz1), 0.0)
end if

К сожалению, компилятор просто возвращает:

gaussian1.f90:122.18:

kz2 = (REAL(kz2),0.0)
                1
Error: Expected a right parenthesis in expression at (1)

gaussian1.f90:126.18:

kz1 = (REAL(kz1), 0.0)
                1
Error: Expected a right parenthesis in expression at (1)

Буду признателен за любой совет - правильно ли я решаю эту проблему?

ОБНОВЛЕНИЕ: мне удалось избежать проблемы с помощью:

if (aimag(kz2) < 0.0005) then
    kz2 = real(kz2)
end if

if (aimag(kz1) < 0.0005) then
    kz1 = real(kz1)
end if

Но что бы я сделал, если бы я хотел установить мнимую часть на ненулевое значение?

Ответы [ 2 ]

9 голосов
/ 16 марта 2012

Я думаю, что вы ищете функцию CMPLX, которая преобразует действительные или целочисленные аргументы в комплексное число.Итак, в вашем примере вы должны быть в состоянии сделать что-то вроде этого:

kz1 = cmplx(real(kz1), 0.)

Пробная нотация в стиле (1.0,1.0), которую вы пробовали, действительна только для постоянных значений, не образуя комплексное число из значений, хранящихся впеременные.

8 голосов
/ 16 марта 2012

В Fortran 2008 есть еще больше возможностей.Вы можете получить доступ к действительным и мнимым частям как к компонентам производного типа, например,

   a = c%re
   b%im = 5

Таким образом, чтобы установить мнимую часть z на ноль в новых компиляторах, вы можете попробовать z%im = 0.

...