Fortran算术错误

时间:2017-12-03 22:22:09

标签: loops math fortran integer-arithmetic

我对fortran有一个有趣的问题。也就是说,当它试图将774840977乘以3并添加一个时,似乎会产生一致的算术错误,它打印出-1970444364,这显然不是正确的答案。  现在,我认为它在其他几个地方犯了同样的错误,但是当它发生时很难找到它。下面的do循环通常会运行1-10,000,000,但此数字弹出的值是n = 786431,所以为了方便起见,我缩小了该值的边界。我认为这是一个整数限制的问题或类似于fortran的问题,但我想知道是否有任何方法可以在fortran中解决这个问题,或者我是否需要在其他方面尝试这个问题。对于我在这里所做的事情的背景,我正在通过collat​​z链,你可以看看那些好奇的。 [算术步骤快照] [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

1 个答案:

答案 0 :(得分:5)

欢迎来到整数溢出的精彩世界。可以存储在(带符号的)4字节整数中的最大数量是2,147,483,647,小于2,324,522,932,3 * 774840977 + 1的结果

您可以将变量声明为8字节整数,然后溢出只发生在9,223,372,036,854,775,807。

Fortran标准没有无符号整数