为什么这两个计算完全相同,使用gfortran在Fortran中给出不同的结果?

时间:2015-06-15 10:09:01

标签: arrays floating-point fortran gfortran floating-point-precision

real, dimension(3), parameter :: boxlen = [4.0, 5.0, 7.0]
real, parameter :: mindist = 0.1
integer ::i

  write(*,"(A)") "Operation on array"
  print*, floor(boxlen/mindist)
  write(*,"(/A)") "Operation on individual elements"
  do i=1,3
     print*, i, floor(boxlen(i)/mindist)
  enddo

这是我运行此代码时得到的结果。

Operation on array
      40          50          70

Operation on individual elements
       1          39
       2          49
       3          69

有人可以解释为什么两个计算(一个使用数组操作而另一个使用单个元素的操作)给出不同的结果?我认为它们应该是一样的。

1 个答案:

答案 0 :(得分:0)

对于我在x86_64-linux-gnu上的GFortran 4.8.2我得到了

Operation on array
          40          50          70

Operation on individual elements
           1          40
           2          50
           3          70

凝视我的水晶球,如果您使用32位x86,计算值存储到内存和打印的顺序可能会有所不同。

另外,用" -fdump-tree-original"查看生成的中间代码,似乎对于数组操作,分区是在编译时完成的,所以至少应该正确舍入谢谢到MPFR)。