2014-12-03 4 views
0

저는 fortran90 코드가 매우 이상한 문제에 직면하고 있기 때문에 여기에 게시하기로했습니다. 사실, 나는 배정 밀도 변수를 선언하도록 :Fortran 문제 0 + 0이 0이 아닙니다

double precision, dimension(-1:20,-1:20) :: a,b,c 

가 그럼 난, 제로로

a(:,:) = 0.d0 
b(:,:) = 0.d0 
c(:,:) = 0.d0 

모든 변수를 초기화 그리고 마지막으로 내가 각을 확인

a(1:17,2:18) = a(1:17,2:18) + b(1:17,2:18) + 0.5d0*c(1:17,2:18) 

내 계산이 수행 변수와 이것들은 모두이 계산 전에 0과 같습니다. 그러나 다음을 얻습니다.

abs(maxval(a(1:17,2)) - minval(a(1:17,2))) = 4.336808689942018E-019 

이것은 의미가 없지만 어디에서 문제가 발생했는지 전혀 알지 못합니다. 누군가 나를 도와 줄 수 있습니까?

감사

PS : "-O3 -xHost -vec-report0 -implicitnone -warn truncated_source -warn argument_checking -warn되지 않는 -warn 선언 -warn 정렬 -warn ignore_loc : 나는 다음과 같은 옵션이 ifort 사용하고 있습니다 -warn usage -check nobarks -ftz "

+0

가능한 중복 (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+0

또는 : https : //로 유래 .com/questions/21895756/why-are-floating-point-numbers-부정확하다 –

+3

이것을 문제를 보여주는 복사/붙여 넣기 가능한 예제로 변환 할 수 있다면 유용 할 것입니다. 하지만 추론 된 프로그램을 사용하여 복제 할 수는 없습니다. – francescalus

답변

0

MS Visual Studio 2005 (인텔 포트란 11.0.3452.2005)에서 코드 조각을 실행하고 0.000000000000000E + 000을 받았습니다. GNU Fortran 4.9.0에서도 같은 결과가 나타납니다.

당신의 경우에 차이가 있는지 확실하지 않지만 ABS 대신 DABS를 사용하도록 제안 할 수는 있습니다.

파우스 토

[소수점 연산이 깨진 떠?]의
+2

항상 제네릭 내장 함수를 사용하고 컴파일러에서 작업을 처리하는 방법을 결정하게하는 것이 가장 좋습니다. –

+0

Joel과 동의하십시오. 일반적인 'abs'는 더 나은 스타일입니다. –

+0

개인 정책/취향의 문제라고 생각합니다. 그러나 필자가 작성한 프로그램 문에 대해 더 나은 것이 무엇이든간에 컴파일러가 결정하도록하지는 않습니다. 때로는 좋은 생각입니다. 이중 정밀도 내장 함수를 사용하여 오류가 발생하면 그 코드가 어딘가에서 엉망이되고 코드가 수정되어야한다는 표시입니다. –

관련 문제