使用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}}!
为什么会发生这种情况?
答案 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 )
如果你想要相对差异而不是绝对的