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

问题描述 投票:3回答:1

在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),但有些网页说它们是供应商扩展(尽管通常由许多编译器支持)。

我已阅读各种页面,但信息相当混乱(即,不太清楚“标准”方式是什么),所以我很感激任何关于这些功能选择的建议。

fortran
1个回答
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创建特定的包装器。

© www.soinside.com 2019 - 2024. All rights reserved.