2014-01-28 2 views
0

int() 함수를 사용할 때 문제가 발생했습니다. 나는 실제 배열 mEL을 가지고 있으며, 실제 배열 COORDS과 비교하기 위해 일부 구성 요소를 정수로 변환하려고합니다. 나는 때문에 COORDS 배열의 오류를 반올림 int()를 사용하는, 그래서 ZERO 아주없는 제로 3.D-77 또는 유사합니다Fortran 77의 int() 함수

 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 

1000 회 실행 중일 때 나는 int(COORDS(1,1))=1829이됩니다. 그러나, 일부 실행 후 나는 얻는다 : int(COORDS(1,1))=1828! 하지만 COORDS(1,1)=1829!

왜 그런가?

+0

두 값 사이에 큰 차이가 있습니까? –

+0

아니요, 싫습니다. 그것이 내가 그것을 피하고자하는 이유입니다. 문제는 int (COORDS (1,1))가 때때로 1828과 같지만 COORDS (1,1)이 1829.0000이므로 int (COORDS (1,1))가 1829가 될 것이라고 기대했습니다. – jpcgandre

+3

Well 'int'는 자르므로'coords (1,1)'이 (대략)'1828.9999999999'와 같으면 (특정 포맷 옵션에서)'1829.0000000' 또는'1829'로 표시되지만 잘라 버릴 수 있습니다 올바르게)를 '1828'로 바꾼다. 당신이 우리에게 말한 것은 그 가능성을 배제하지 않습니다. 실행 중에'coords (1,1) '이 업데이트됩니까? –

답변

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) 상대적인 차이가 절대적이 아닌 차이를 원한다면

+0

우수 답변! – jpcgandre