Fortran 77中的int()函数

时间:2014-01-28 16:50:37

标签: int fortran

使用int()功能时遇到问题。我有一个真正的数组mEL,我想将它的一些组件转换为整数,以便与实数数组COORDS进行比较。由于int()数组中的舍入错误,我必须使用COORDS,因此ZERO不是3.D-77或类似的 DO I = 1,nLines IF (int(mEL(I,1)).EQ.int(COORDS(1,1)) .AND. 1 int(mEL(I,2)).EQ.int(COORDS(2,1)) .AND. 2 int(mEL(I,3)).EQ.int(COORDS(3,1))) THEN .....do something

int(COORDS(1,1))

问题是在运行期间COORDS(1,1)的结果发生了变化,但COORDS(1,1) = 1829.0000000 的值却相同。例如:

int(COORDS(1,1))=1829

在1000次运行期间,我得到int(COORDS(1,1))=1828。但是,经过一些运行,我得到: COORDS(1,1)=1829!但是{{1}}!

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

有关该主题的介绍,请参阅文章The Perils of Floating Point中的“安全比较”部分

因此,对于您的代码,您可以使用

      REAL EPS 
      PARAMETER (EPSILON = .000001)

      DO I = 1,nLines
          IF ((abs(mEL(I,1) - COORDS(1,1)) .LT. EPS )  .AND.
 1            (abs(mEL(I,2) - COORDS(2,1)) .LT. EPS )  .AND.
 2            (abs(mEL(I,3) - COORDS(3,1)) .LT. EPS )) THEN

          .....do something

          ENDIF
      ENDDO

您甚至可以使用abs(mEL(I,1) - COORDS(1,1)) .LT. (abs(mEL(I,1))* EPS )之类的内容 或abs(mEL(I,1) - COORDS(1,1)) .LT. (abs(mEL(I,1) + COORDS(1,1))* EPS )如果你想要相对差异而不是绝对的