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

roy*_*vib 4 fortran

在 Fortran 中,我总是使用双精度,因此我一直使用特定的函数,例如dbledimag来获取复数变量的实部和虚部。但是,对于其他函数,例如sin,我不再使用dsin,因为前者返回正确类型的值(即,sin是通用函数)。对于复杂变量来说似乎也是如此。所以我的问题是:

1)最推荐的获取实部和虚部的通用函数是什么?

-- 似乎real(z)aimag(z)、 和conjg(z)总是返回正确的类型(通过 gfortran 的实验),即,如果z是双精度,则这些函数返回双精度。这有保证吗?另外,行为是否取决于编译器使用的标准?(即 Fortran 77 与 90 或更高版本,特别是对于real(z)?)

2)如果我(尽管如此)想使用仅接收双精度参数并始终返回双精度值的特定函数,那么特定函数是什么?

-- 我一直在使用dble(z)dreal(z), dimag(z),dconjg(z)--到目前为止,

我已经阅读了各个页面,但信息相当混乱(即,不太清楚什么是“标准”方式),所以我将不胜感激有关选择此类功能的任何建议。

fra*_*lus 5

作为背景,我们所说的实变量和复变量是什么意思?当然,你知道什么是真实的物体。

复杂的物体由实部和虚部组成。如果一个复杂对象具有给定的类型,那么每个组件都是与该复杂对象的类型相对应的真实类型。

说来话长,如果

complex(kind=k) z
Run Code Online (Sandbox Code Playgroud)

然后KIND(z%re)KIND(z%im)都计算为k(为清楚起见,使用 Fortran 2008 引入的复杂部分指示符)。

现在,real内在泛型采用复杂的表达式并返回其实部。它这样做遵循以下 F2008 规则 (13.7.138),其中A是参数:

如果 A 是复杂类型并且 KIND 不存在,则 kind 类型参数是 A 的 kind 类型参数。

所以,是的:在当前的 Fortran 中,real如果没有请求的种类,总是会为您提供复合体真实组件的真实种类。无论是双精度还是其他。

类似地,aimag返回复数类型的实数(对应于虚数部分)。与 不同的是realaimag不接受kind=控制结果类型的参数。

Fortran 77 的情况有所不同:没有类似的 kind 概念,只有一个complex

dble是一个标准内在函数。尽管这总是返回双精度,但它仍然是通用的,并且可以接受任何数字。 dble(a)与 相同real(a,kind(0d0)),无论 的类型如何a。没有(标准)具体。

drealdimag并且dconjg不是标准内在函数。

我想real如果有人非常关心的话,可以创建特定的包装器。