我有两个很短的问题:
1 - 我刚看到DEXP()
是EXP()
的古老形式。这是否意味着它不应再被使用了?我一直认为DEXP()
是等同于EXP()
的双精度。
2 - 指数函数的范围是多少?它是编译器依赖的吗?
提前感谢您的帮助!
最佳, 雷梅克
答案 0 :(得分:17)
如前所述,使用泛型函数(如EXP())总是优先于过时类型特定的等价物,例如DEXP()。
在旧的(非常旧的)FORTRAN版本(FORTRAN 77之前)中,每种数据类型都需要不同的功能。因此,如果您希望指数函数需要:EXP()表示单精度数,DEXP()表示双精度数,或CEXP()表示复数。 FORTAN现在具有函数重载功能,因此单个函数适用于任何标准类型。
原则上,指数的可能范围可以是处理器和编译器相关的。但是,如前所述,大多数现代处理器和编译器都将使用IEEE标准。
如果需要,可以在声明变量时指定变量的所需范围。要使用的函数是SELECTED_REAL_KIND([P,R])
。
例如,假设您确保x
是一个十进制精度至少为10位且十进制指数范围至少为100的类型。
INTEGER, PARAMETER :: mytype = SELECTED_REAL_KIND(10, 100)
REAL(KIND=mytype) :: x
有关详细信息:SELECTED_REAL_KIND
实际上,如果您编写的程序需要一定的准确性,并且可以在异国情调或旧系统上运行,那么以这种方式定义类型是一个非常好的主意。这里显示了一些常见的定义:Real Precision
答案 1 :(得分:3)
“exp”是一个泛型函数,它返回与其参数相同的类型 - 实数或复数的精度。它应该优先于旧形式“dexp”使用,因为使用“exp”编译器将自动返回正确的类型。通用名称已添加到Fortran 77中。
答案 2 :(得分:0)
问题第2部分的答案是指数函数的范围是所有正实数的集合。在Fortran术语中,这意味着所有REAL数字的集合大于0.是的,根据Fortran标准,编译器依赖,但实际上,如果你把它作为所有正IEEE的集合,你就不会出错浮点数,单精度或双精度。但要严格要求你需要熟悉编译器支持的实数的KIND,这几乎肯定包括IEEE f-p数字,但也可能包括其他数字。