2017-12-03 16 views
1

포트란과 관련하여 흥미로운 문제가 있습니다. 즉, 774840977에 3을 곱해서 1을 더하려고 할 때 일관된 산술 실수를하는 것처럼 보입니다. -1970444364를 인쇄합니다. 이는 분명히 정답이 아닙니다. 이제는 다른 곳에서도 이와 똑같은 실수를 저지르고 있다고 생각합니다. 그러나 일어날 때 이것을 찾아내는 것은 어렵습니다. 아래의 do 루프는 일반적으로 1-10,000,000까지 실행되지만이 숫자가 팝업되는 값은 n = 786431이므로 사용자의 편의를 위해 해당 값을 바로 축소했습니다. 나는 그것이 포트란에서 정수 제한이나 이와 같은 문제라고 생각하지만, 포트란에서 이것을 해결할 방법이 있는지 또는 다른 것을 시도 할 필요가 있는지 알고 싶습니다. 내가 여기서하고있는 일의 맥락에서, 나는 collatz 사슬을 통해 달리고있다. 호기심이 있다면 그것들을 볼 수있다. [스냅 샷 산술의 단계] [정수 오버 플로우의 놀라운 세계에 enter image description here포트란 산술 오류

 program Collatzthings 
    implicit integer*4 (i-o) 
    implicit doubleprecision*8 (a-h) 
    integer*4 n0 

    open(1,file='datac',status='unknown') 
    e=0 
    do 100 n0=786431,786431 
    n=n0 
    i=0 
    j=0 
    do while (n.GT.1) 
     if (mod(n,2).EQ.0) then 
     n=.5*n 
     i=i+1 
     j=(j+1) 
     elseif (mod(n,2).EQ.1) then 
     n=((3*n)+1) 
     i=i+1 
     endif 
     write(6,*)n 
    end do 
    b=i 
    c=j 
    a=c/b 
pause 
    write(1,*)n0,i,a 
100 continue 
close(1) 
stop 
1000 format(7(g12.4,1x)) 
end 

답변

5

에 오신 것을 환영합니다. (A)에 저장 될 수있는 최대 수는 4 바이트 정수 미만 2,324,522,932, 3 * 774840977 + 1

결과 그러면 오버플 것이다 8 바이트 정수 변수를 선언 할 수있다 2,147,483,647 ( 서명) 9,223,372,036854775807에만 발생합니다.

포트란 표준은 부호없는 정수

이 없습니다