我有一段代码在调试版本和优化版本之间的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
Run Code Online (Sandbox Code Playgroud)
当我将其编译为调试版本时,它会生成正确的结果.当我将它编译为优化构建时,它用a替换b的每个元素.
$ 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
Run Code Online (Sandbox Code Playgroud)
如果这是一个编译器错误,我该如何解决它?
您的代码没有任何问题,英特尔Fortran编译器会生成带有和不带-O3标志的相同,正确的输出.虽然,作为@eriktous指出,有比较浮点数时须遵守的美味佳肴,都0和1恰恰表示的平等和比较(当然它实现IEEE浮点运算的任何机器上),比如你的代码的展品应该是精细.
如果这是一个编译器错误,我怀疑它可能是,通常的解决方法是使用另一个编译器(版本).
我无法重现你的问题.我正在使用
gcc版本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构建是否正常工作并且没有绝对破坏?