在Fortran中,我总是使用双精度,所以我一直在使用dble
和dimag
等特定函数来获取复杂变量的实部和虚部。然而,对于像sin
这样的其他函数,我不再使用dsin
,因为前者返回适当类型的值(即,sin
是通用函数)。对于复杂的变量似乎也是如此。所以我的问题是:
1)获得实部和虚部最常用的通用函数是什么?
- 似乎real(z)
,aimag(z)
和conjg(z)
总是返回一个合适的类型(通过gfortran实验),即,如果z
是双精度,那些函数返回双精度。这有保证吗?此外,行为是否依赖于编译器使用的标准? (即Fortran 77 vs 90或更高版本,特别是对于real(z)
?)
2)如果我(尽管如此)想要使用仅接收双精度参数且始终返回双精度值的特定函数,具体函数是什么?
- 到目前为止,我一直在使用dble(z)
和dreal(z)
,dimag(z)
,dconjg(z)
,但有些网页说它们是供应商扩展(尽管通常由许多编译器支持)。
我已阅读各种页面,但信息相当混乱(即,不太清楚“标准”方式是什么),所以我很感激任何关于这些功能选择的建议。
作为背景,我们的真实和复杂变量是什么意思?当然,你知道真实物体的含义。
复杂对象由实部和虚部组成。如果复杂对象具有给定种类,则每个组件是与复杂对象的种类相对应的实体。
如果,这是一个很长的路要走
complex(kind=k) z
然后KIND(z%re)
和KIND(z%im)
都评估为k
(使用Fortran 2008引入的复杂部分指示符来清晰)。
现在,real
内在泛型采用复杂表达式并返回其实际组件。它这样做符合以下F2008规则(13.7.138),其中A
是参数:
如果A的类型为complex且KIND不存在,则kind类型参数是A的类型参数。
所以,是的:在当前没有请求类型的Fortran real
中,总会给你一个真实的那种复杂的真实组件。无论是双精度还是其他精度。
类似地,aimag
返回复数的实数(对应于虚部)。与real
不同,aimag
不接受控制结果种类的kind=
论据。
Fortran 77的情况有所不同:没有类似的概念,只有一个complex
。
dble
是标准内在的。虽然这总是返回双精度,但它仍然是通用的,并且将接受任何数字。 dble(a)
与real(a,kind(0d0))
相同,无论a
的类型如何。没有(标准)具体。
dreal
,dimag
和dconjg
不是标准的内在函数。
我想如果一个人非常关心,可以围绕real
创建特定的包装器。