获取复杂变量的实部和虚部的通用和特定函数

时间:2017-03-15 18:35:43

标签: fortran

在Fortran中,我总是使用双精度,所以我一直在使用dbledimag之类的特定函数来获取复杂变量的实部和虚部。但是,对于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>

1 个答案:

答案 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相同。没有(标准)具体。

drealdimagdconjg不是标准的内在函数。

我想如果一个人非常关心,我可以围绕real创建特定的包装器。