在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),但有些网页说它们是供应商扩展(尽管许多编译器通常支持它们)。
我看过很多页,但资料相当混乱(即不太清楚甚麽是“标准”方式),所以我希望能就这类功能的选择提出意见。
发布于 2017-03-15 19:02:43
作为背景,我们所说的各种真实和复杂的变量意味着什么?当然,你知道真正的物体是什么意思。
一个复杂的物体由一个实部和一个虚部组成。如果一个复杂的对象有一个给定的类型,那么每个组件都是一个与复杂对象的类型相对应的实类。
这是一个很长的说法,如果
complex(kind=k) z然后,KIND(z%re)和KIND(z%im)都评估为k (为了清晰起见,使用Fortran 2008引入的复杂部件指示符)。
现在,real内部泛型接受一个复杂的表达式并返回它的真实组件。它这样做符合以下F2008规则(13.7.138),其中A是参数:
如果A是类型复杂且不存在的,则该类型参数就是A的类类型参数。
所以,是的:在当前的Fortran中,没有请求的类的real总是会给你一个真实的类型--复杂的真实组件。不管是双精度还是其他。
类似地,aimag返回一个实数(对应于虚部),即复数的实数。与real不同,aimag不接受控制结果类型的kind=参数。
对于Fortran 77来说,情况就不一样了:没有类似的概念,只有一个complex。
dble是一个标准的内在特性。虽然这总是返回双精度,但它仍然是通用的,并将接受任何数字。dble(a)和real(a,kind(0d0))是一样的,不管a的类型是什么。没有(标准的)具体规定。
dreal、dimag和dconjg不是标准的本质。
我想,如果一个人非常关心的话,就可以为real创建特定的包装器。
https://stackoverflow.com/questions/42818050
复制相似问题