事实证明,以下内容在 fortran 77 中是非法的:
c
program main
real a
parameter(a=(10.)**(.5))
c
...
原因是参数语句采用常量算术表达式,除指数为整数时,取幂是非法的。(第 6.1.3 和 8.6 节http://www.fortran.com/F77_std/rjcnf0001-sh-8.html#sh-8.6)。有人知道在标准的新修订版中是否放宽了此限制?为什么这首先是非法的?
事实证明,以下内容在 fortran 77 中是非法的:
c
program main
real a
parameter(a=(10.)**(.5))
c
...
原因是参数语句采用常量算术表达式,除指数为整数时,取幂是非法的。(第 6.1.3 和 8.6 节http://www.fortran.com/F77_std/rjcnf0001-sh-8.html#sh-8.6)。有人知道在标准的新修订版中是否放宽了此限制?为什么这首先是非法的?
是的,这已经放松了。在 Fortran 2003 中,您甚至可以使用内部函数,如sin
or exp
。
我的猜测是整数指数有一个简单的实现,编译器可以调用它来替换值作为预编译步骤。但是,非整数指数(和负指数)可能具有无法评估为实数的值;关键不是这个例子是不可计算的,只是编译器需要是可预测的,并且让这些表达式失败比编写一个可以确定给定表达式是否会计算为合理数字的例程更简单。请记住,这是在编译之前完成的,而不是通过编译表达式、运行它并使用值来完成,因此范围没有一般的 fortran 宽。
如果这对您来说是个问题,那么请考虑宏和 F90/F77 而不是 f90/f77 文件,以便编译器知道运行预处理器。
或者只是将计算器上的值计算为 16dp 并使用它。
或者让它成为一个普通变量而不是一个参数。成本将是最小的。