2017-04-03 13 views
1

Fortran 언어로 코딩 할 때 do-loop에서 REAL 값을 control-var로 설정하면 출력이 이상합니다. 예 :포트란에서 do-loop 제어 변수로 REAL 유형 값을 사용할 때 출력이 이상한 이유

do i=0.1,1.0,0.1 
write (13,"(F15.6)") i 
end do 

끈다은 : 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 나누었다 제가 0.6 시작 값을 설정할 때 0.6,0.7,0.8,0.91.0는 출력되지 않는다 :

do i=0.6,1.0,0.1 
write (13,"(F15.6)") i 
end do 

출력이다. 왜 이런 일이 생길까요?

+2

이 기능을 사용하지 마십시오. 좋은 이유로 삭제되었습니다. 이걸 잃어 버렸어. –

답변

6

이것은 기본적으로 반올림 문제입니다 (Precision problems of real numbers in Fortran 참조). 두 개의 부동 소수점을 비교하는 것은 까다롭기 때문에 do 루프와 잘 작동하지 않습니다.

좀 더 진수를 인쇄해야합니다뿐 아니라 6 :

0.1000000015 
    0.2000000030 
    0.3000000119 
    0.4000000060 
    0.5000000000 
    0.6000000238 
    0.7000000477 
    0.8000000715 
    0.9000000954 
    1.0000001192 

값은 정확하지 않다.

Fortran에서 반복 횟수는 루프를 시작하기 전에 계산됩니다. 당신은 루프 여행의 수를 계산할 때 :

9.0000000000 
    3.9999997616 

그래서 후자가 반복됩니다 만 네 번 (3 + 1 = 4; 그래서 = 0.6, 0.7 :

write (*,"(F15.10)") (1.0 - 0.1)/0.1 

write (*,"(F15.10)") (1.0 - 0.6)/0.1 

당신은 얻을 것이다 , 0.8 및 0.9). 왜냐하면 카운트가 3.999 ...에서 3로 잘 리기 때문입니다.

실제 루프 카운터는 좋은 이유로 Fortran에서 삭제되었으므로 사용하지 마십시오. 반올림 문제 중 하나입니다. 컴파일러는 경고한다 :

경고 : 삭제 기능 : 범죄해야 ireal 변수의 이름을 지정, (1)해야합니다 정수 또한

에서 DO 루프 식을 시작합니다.