cmplx() 中的精度和种类

Precision and kind in cmplx()

根据文档。

cmplx(x,y) 默认为单精度。

但是它有kind个参数

CMPLX( x, y, kind) has the complex value whose real part is REAL( x, kind) and whose imaginary part is REAL( y, kind).

但我试过了

print*,cmplx(1.12,2.34,kind(0D0))

它给出

(1.12000000476837,2.33999991416931)

complex(8),但是精度丢失了。

虽然我知道在这种情况下,我可以简单地使用(1.12D0,2.23D0)。但我想知道 kindcmplx 中的意义何在?

问题是常量是单精度的,即使它们用于定义双精度变量。您需要指定常量的精度。以下示例程序使用来自 Fortran 2003 的 ISO Fortran 环境的类型 real64,表示 64 位(即双精度):

program test

   use, intrinsic :: ISO_FORTRAN_ENV

   print*,cmplx(1.12,2.34,kind(0D0))
   print*,cmplx(1.12_real64,2.34_real64,kind(0.0_real64))

end program test

您用 1.23D0, 2.34D0 取得了成绩。 kind 选项在其他上下文中很有用,例如,更改传递给子例程的变量类型以匹配预期的参数:call SomeSub ( cmplx (1.12, 2.34, kind (0D0) ) 将匹配子例程的参数 SomeSub期望双精度复数参数。