gpt4 book ai didi

带有 ifort 的指数的 Fortran 运算符优先级错误

转载 作者:行者123 更新时间:2023-12-04 15:00:58 24 4
gpt4 key购买 nike

在评估一个带指数后跟乘法的简单表达式时,我在 Portland 和 Intel fortran 编译器之间得到了不同的行为。根据我对运算符优先级的理解,我很确定 pgf90(和 gfortran)可以正常工作,但我想要第二个意见,因为这些事情可能会有点棘手。

这是我的代码简化为一个非常基本的形式。当与 ifort 一起运行时,表达式 d1=a**-2*b被解释为 d1=a**(-2*b) by ifort by as d1=(a**-2)*b由 pgf90 和 gfortran 编写。如果我从指数中删除负号,所有三个编译器都将其解释为 d1=(a**2)*b .如果我将 *b 更改为 +b,我也会从这三个方面获得良好的行为。

program badvals
implicit none
real :: a, b, c1, c2, d1, d2

a = 2.
b = 4.

! Works with addition following the exponent.
c1 = a**-2+b
c2 = a**(-2)+b

! Ifort differs with multiplication following negative exponent.
d1 = a**-2*b
d2 = a**(-2)*b

print*, "c1, d1 = ",c1, d1
print*, "c2, d2 = ",c1, d2
print*, "c2-c1, d2-d1 = ",c2-c1, d2-d1
end program badvals

!Program output for ifort v13.0.1.117: (either -O0 or -fast):
! c1, d1 = 4.250000 3.9062500E-03
! c2, d2 = 4.250000 1.000000
! c2-c1, d2-d1 = 0.0000000E+00 0.9960938

!Program output for pgf90 v12.10-0: (either -O0 or -fast):
! c1, d1 = 4.250000 1.000000
! c2, d2 = 4.250000 1.000000
! c2-c1, d2-d1 = 0.000000 0.000000

!Program output for gfortran v4.1.2: (either -O0 or -O3):
! c1, d1 = 4.250000 1.000000
! c2, d2 = 4.250000 1.000000
! c2-c1, d2-d1 = 0.000000 0.000000

这些差异背后是否有历史,因此它们应该被视为“特征”?或者,这是英特尔的一个彻头彻尾的错误吗?

最佳答案

在网上搜索,我发现不允许连续使用两个运算符的说法。因此,解释而不是拒绝这个表达是对语言的扩展。该扩展已由不同的编译器供应商以不同方式实现。

事实上,当我使用带有限制性编译器选项的 gfortran 时,它拒绝了这个代码示例:

badvals.f90:9.11:
c1 = a**-2+b
1
Error: Extension: Unary operator following arithmetic operator (use parentheses) at (1)
badvals.f90:13.11:

d1 = a**-2*b
1
Error: Extension: Unary operator following arithmetic operator (use parentheses) at (1)

同样,带有限制性编译器选项的 ifort 提供以下内容:
badvals.f90(9): warning #7026: Non-standard extension
c1 = a**-2+b
----------^
badvals.f90(13): warning #7026: Non-standard extension
d1 = a**-2*b
----------^

所以:
1) 使用编译器的警告和错误选项会很有帮助,
2)它更像是一个扩展而不是一个错误,
3) 即使该语言允许此表达式,gfortran 的建议也很好——即使不需要,也请使用括号以保持清晰。

关于带有 ifort 的指数的 Fortran 运算符优先级错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com