gpt4 book ai didi

fortran - 逻辑操作的顺序(潜在的 ifort 错误)

转载 作者:行者123 更新时间:2023-12-01 08:53:17 24 4
gpt4 key购买 nike

在英特尔论坛上将此作为编译器错误报告之前,我想知道以下是否符合标准。我的问题是:逻辑运算的顺序在 Fortran 中总是固定的吗?

! main.f90
interface
subroutine f(x)
logical, intent(in), optional :: x
end subroutine f
end interface
call f(.false.)
call f(.true.)
call f()
end program

! f.f90
subroutine f(x)
logical, intent(in), optional :: x
print*, present(x) .and. x
end subroutine f

gfortran main.f90 f.f90 && ./a.out 打印

F
T
F

ifort main.f90 f.f90 && ./a.out 打印

 F
T
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 0000000000476D75 Unknown Unknown Unknown
a.out 0000000000474997 Unknown Unknown Unknown
a.out 0000000000444264 Unknown Unknown Unknown
a.out 0000000000444076 Unknown Unknown Unknown
a.out 0000000000425176 Unknown Unknown Unknown
a.out 00000000004027A0 Unknown Unknown Unknown
libpthread.so.0 00007F3560702E80 Unknown Unknown Unknown
a.out 0000000000402633 Unknown Unknown Unknown
a.out 000000000040260F Unknown Unknown Unknown
a.out 00000000004025AE Unknown Unknown Unknown
libc.so.6 00007F3560371710 Unknown Unknown Unknown
a.out 00000000004024A9 Unknown Unknown Unknown

我正在使用 GCC 5.3.0 和 Ifort 16.0.2。

最佳答案

不,Fortran 标准不保证计算逻辑表达式的顺序。就像数学表达式一样,编译器可以自由地将它们重新排序为在“真实逻辑”(或“真实数学”)的完美世界中等价的顺序,但在不完美的计算机世界中不等价。

您可以执行这样的评估顺序:

if (.not. present(x)) then
print*, .false.
else
print*, x
end if

我的标准草案副本包括条款

7.1.5.4.2 Evaluation of logical intrinsic operations

Once the interpretation of a logical intrinsic operation is established, the processor may evaluate any other expression that is logically equivalent, provided that the integrity of parentheses in any expression is not violated.

我对标准的解释是程序不符合标准,因为它引用了一个不存在的可选参数。请参阅第 12.5.2.12 3 (1) 节,其中规定了这一点。因为 .and. 运算符的操作数的求值顺序未定义 x 可能在不存在时被引用。

关于fortran - 逻辑操作的顺序(潜在的 ifort 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35607448/

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