2017-12-03 16 views
1

私はfortranに興味深い問題があります。つまり、774840977に3を掛けて1を加えようとすると、一貫した算術ミスをしているように見えます。それは-1970444364を出力します。これは明らかに正しい答えではありません。 さて、私はそれがこの他のいくつかの場所で同じような間違いを犯していると思いますが、それが起こるとこれを見つけるのは難しいです。以下のdoループは通常1〜10,000,000まで実行されますが、この数値がポップアップする値はn = 786431です。そのため、私はあなたの便宜のためにその値に境界を縮小しました。私は、それが整数の制限やFortranのような問題であると想定していますが、Fortranでこれを解決する方法があるのか​​、それとも何か他の方法でこれを試す必要があるかどうかを知りたいと思います。私がここで何をしているのかについて、私はそれをcollat​​zチェーンで実行しています。好奇心があればそれらを見ることができます。 [算術ステップのスナップショット] [enter image description hereFortran算術エラー

 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

は、整数オーバーフローの素晴らしい世界へようこそ。 (を締結)に格納することができる最大数は、4バイトの整数2324522932未満である2,147,483,647であり、3 * 774840977 + 1

の結果は、その後、オーバーフローがだろう、8バイトの整数として変数を宣言することができ9,223,372,036,854,775,807でのみ発生します。

のFortran規格では、符号なし整数

を持っていません