我有一段代码在调试构建和优化构建之间在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所指出的,在比较浮点数时,有一些微妙的东西需要观察,0
和1
都是精确可表示的(当然在任何实现IEEE浮点算术的机器上),并且像你的代码所展示的相等性比较应该是好的。
如果这是一个编译器错误,我怀疑它可能是,通常的解决方法是使用另一个编译器(版本)。