在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)
,但有些网页说它们是供应商扩展程序(尽管通常支持)许多编译器)。
我已阅读各种页面,但信息相当混乱(即,不太清楚&#34;标准&#34;方式是什么),所以我很感激有关选择此类功能的任何建议。< / p>
答案 0 :(得分:3)
作为背景,各种真实和复杂的变量是什么意思?当然,你知道真实物体的含义是什么。
复杂对象由实部和虚部组成。如果复杂对象具有给定类型,那么每个组件都是与复杂对象的类型相对应的实体。
这是一个很长的路要走,如果
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
创建特定的包装器。