Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 如何将复数的虚部设为零?_Floating Point_Fortran_Complex Numbers - Fatal编程技术网

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