Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
732 views
in Technique[技术] by (71.8m points)

fortran - Fibonacci numbers becoming negative after a certain term

I wrote this program in Fortran to display the Fibonacci numbers up to the x-th term:

program fibonacci
implicit none
integer :: x,p,c,i,t !initializes limit, previous, current, iterative, and temp
print *, "List the first x fibonacci numbers: "
read *, x      !reads the limit
p=0            !sets previous to zero
c=1            !sets current to 1
do i=1,x
    print *, c !prints the current fibonacci number
t = c      !sets the temporary variable to the current
c = c + p  !sets the current to the current plus the previous
p = t      !sets the previous to the temporary value
end do         !iterates until it reaches the limit 'x'
end program fibonacci

When I compile and run it, and enter the number 10, it does as is expected

 List the first x fibonacci numbers: 
10
       1
       1
       2
       3
       5
       8
      13
      21
      34
      55

but when I entered 50:

 List the first x fibonacci numbers: 
50
       1
       1
       2
       3
       5
       8
      13
      21
      34
      55
      89
     144
     233
     377
     610
     987
    1597
    2584
    4181
    6765
   10946
   17711
   28657
   46368
   75025
  121393
  196418
  317811
  514229
  832040
 1346269
 2178309
 3524578
 5702887
 9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
512559680
-811192543
-298632863

I don't know what the problem is, as far as I can see, the logic is sound. Where is my mistake?

I'm using the gfortran compiler.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I'm no fortran expert, but I did take a class once...

Apparently you're using a four byte integer (http://www-classes.usc.edu/engr/ce/108/text/fbk01.htm) for these. After, 1836311903 you're exceeding the maximum integer value (2147483647) and the calculations are overflowing.

You have two options for calculating fibonacci numbers with more precision. First, you can find a system/fortran compiler combination that support 8 or 16 byte integers. Support in gfortran at least, seems to by system specific. Another option is to use a multiple precision library like gmp.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...