如何将复数的虚部设置为零?

Ale*_*ray 4 floating-point fortran complex-numbers

我需要检查虚部是否非常小并将其设置为零,如果是为了消除一些浮点误差,当它应该为零时,会产生非常小的非零虚部.

我的代码如下:

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
Run Code Online (Sandbox Code Playgroud)

不幸的是编译器只返回:

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)
Run Code Online (Sandbox Code Playgroud)

任何建议都将不胜感激 - 我是否正确地以正确的方式解决这个问题?

更新:我通过使用以下方法避免了这个问题:

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

if (aimag(kz1) < 0.0005) then
    kz1 = real(kz1)
end if
Run Code Online (Sandbox Code Playgroud)

但是如果我想将虚部设置为非零量,我会怎么做?

tal*_*ies 9

我认为您正在寻找CMPLX将实数或整数参数转换为复数的函数.所以你举例来说你应该可以这样做:

kz1 = cmplx(real(kz1), 0.)
Run Code Online (Sandbox Code Playgroud)

(1.0,1.0)您尝试的样式括号表示法仅对常量值有效,而不是从变量中保存的值形成复数.


Vla*_*r F 9

在Fortran 2008中,还有更多的可能性.您可以将实部和虚部作为派生类型组件访问,例如

   a = c%re
   b%im = 5
Run Code Online (Sandbox Code Playgroud)

因此,要z在新编译器中将虚部设置为零,您可以尝试z%im = 0.