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

时间:2012-03-16 10:25:52

标签: 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

不幸的是编译器只返回:

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 个答案:

答案 0 :(得分:9)

我认为您正在寻找CMPLX函数,它将实数或整数参数转换为复数。所以你举例来说,你应该能够做到这样的事情:

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

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

答案 1 :(得分:8)

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

   a = c%re
   b%im = 5

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