Floating point 如何将复数的虚部设为零?
我需要检查虚部是否非常小,如果是,则将其设置为零,以消除一些浮点错误,这些错误会导致非常小的非零虚部,而它本应为零 我的代码如下:Floating point 如何将复数的虚部设为零?,floating-point,fortran,complex-numbers,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) <
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
如果有任何建议,我将不胜感激——我是否以正确的方式解决了这个问题
更新:我通过使用以下方法避免了问题:
if (aimag(kz2) < 0.0005) then
kz2 = real(kz2)
end if
if (aimag(kz1) < 0.0005) then
kz1 = real(kz1)
end if
如果(省(kz2)<0.0005),则
kz2=实(kz2)
如果结束
如果(aimag(kz1)<0.0005),则
kz1=实际值(kz1)
如果结束
但是,如果我想将虚部设置为非零值,我该怎么办呢?我想您正在寻找
CMPLX
函数,它将实数或整数参数转换为复数。因此,您可以举例说明,您应该能够执行以下操作:
kz1 = cmplx(real(kz1), 0.)
您尝试过的
(1.0,1.0)
式括号符号仅对常量值有效,而不是从变量中保存的值形成复数。在Fortran 2008中,还有更多的可能性。您可以访问实部和虚部作为派生类型组件,例如
a = c%re
b%im = 5
因此,要在新的编译器中将
z
的虚部设置为零,您可以尝试z%im=0
谢谢-这似乎正是我想要的。我猜复杂变量的赋值只能取参数,而不能取变量或表达式作为参数?我以前习惯于用C/Python/Matlab编程,所以我不太清楚我必须使用函数而不是直接赋值来设置它。很抱歉提出这样一个琐碎的问题。@AlexMcMurray:是的,复杂赋值的(,)
符号只适用于常量。您需要使用cmplx
函数来使用编译时未知的数量。我将更新我的答案以包括这一点。如果这个答案解决了你的问题,你可以考虑。
a = c%re
b%im = 5