Search code examples
cfor-loopfibonacci

Why does my program go wrong in big numbers


I was trying to make a program that prompts a user for a int value which uses is as the nth of the Fibonacci sequence.

This has goes all well for me until if you input 48. The Fibonacci output shows the last term a negative number, am I doing something wrong?

Open to criticism, I accept some pointers to study on more.

int i,Nth,Num1=0,Num2=1,Num3;
Num3=Num1+Num2;
printf("Enter Fibonacci Sequence terms limit: ");
scanf("%d",&Nth);
printf("Fibonacci Sequence: %d, %d",Num1,Num2);
for(i=3;i<=Nth;++i){
    printf(", %d",Num3);
    Num1=Num2;
    Num2=Num3;
    Num3=Num1+Num2;
};

This is the output when entering 48:

Fibonacci Sequence: 0, 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

Solution

  • The Fibonacci output shows the last term a negative number, am I doing something wrong?

    Yes, you are. You have a signed integer overflow in your code. This is undefined behaviour, which means that anything can happen (including a "seemingly" working code).

    this goes all well for me until if you input 48.

    You can check the maximum value of an integer on your platform using INT_MAX:

    #include <stdio.h>
    #include <limits.h> // You have to include this header
    
    int main(void)
    {
        printf("INT_MAX = %d\n", INT_MAX);
    }
    

    Output:

    INT_MAX = 2147483647
    

    Which is smaller than fib(47) = 2971215073.


    One solution is to use long instead of int. This will solve your problem, unless you want very huge numbers. In this case, you would want to use a dedicated library.