Gfortran 4.9.0 bug?WHERE语句优化掉了



我有一段代码在调试构建和优化构建之间在gfortran下产生不同的结果。

PROGRAM test
IMPLICIT NONE
REAL, DIMENSION(10) :: a = 0.0
REAL, DIMENSION(10) :: b = 1.0
WRITE (*,*) b
WHERE (a .ne. 0.0) b = a
WRITE (*,*) b
END PROGRAM

当我将其编译为调试构建时,它会产生正确的结果。当我将其编译为优化构建时,它将b的每个元素替换为a。

$ gfortran test.f
$ ./a.out
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
$ gfortran -O3 test.f
$ ./a.out
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0     
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 

如果这是一个编译器错误,我该如何工作?

我无法重现您的问题。我使用

gcc version 4.9.0 20140313(实验版)(gcc)

在x86_64-unknown-linux-gnu (Ubuntu 12.04 amd64)。对于我来说,您的示例程序结果如下:

$ gfortran where.f $ ./a.out 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000
1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000
$ gfortran -O3 where.f $ ./a.out 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000
1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000

那么,你用的是哪个版本的gfortran ?请记住,4.9尚未发布,因此预发布版本的日期可能很重要。此外,哪个目标(即操作系统);你在使用吗?如果您自己构建了GCC,您是否运行了GCC测试套件来检查您的gfortran构建是否正常工作并且没有无可避免地损坏?

您的代码没有任何问题,Intel Fortran编译器产生相同的,正确的输出,有和没有-O3标志。然而,正如@eriktous所指出的,在比较浮点数时,有一些微妙的东西需要观察,01都是精确可表示的(当然在任何实现IEEE浮点算术的机器上),并且像你的代码所展示的相等性比较应该是好的。

如果这是一个编译器错误,我怀疑它可能是,通常的解决方法是使用另一个编译器(版本)。

最新更新