0

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
Jabberwocky
  • 48,281
  • 17
  • 65
  • 115
Kryspin
  • 27
  • 3
  • 4
    The question to ask yourself is: how many bytes are used to define an `int`, and what's the maximum value that can be represented with that number of bytes? – Robby Cornelissen Jul 04 '22 at 07:53
  • but is there a library to give me access to a big data type or do i just go to unsigned long long – Kryspin Jul 04 '22 at 07:57
  • You can start by going to a larger int type (unsigned long long or uint64_t), but you'll eventually hit a limit with that type which may or may not be acceptable. If you need much larger precision, google for `"big integer library in c"` – selbie Jul 04 '22 at 08:03
  • @Kryspin Take a look at [this answer](https://stackoverflow.com/q/12335784/16835308). – Zakk Jul 04 '22 at 08:51
  • @Kryspin: The [GNU MP](https://gmplib.org/) library may be what you're looking for. – John Bode Jul 04 '22 at 12:10

4 Answers4

2

You've reached integer's maxmimum:

1836311903 + 1134903170 = 2,971,215,073
32 bit Integer Maximum = 2,147,483,647

You should try different data types to get more values.
More about data types in C: https://en.wikipedia.org/wiki/C_data_types

BenYoo
  • 116
  • 5
1

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.

Zakk
  • 1,935
  • 1
  • 6
  • 17
  • _"One solution is to use long instead of int"_: not on all platforms, on my platform `int` and `long` have the same size. Using `long long int` or just ``long long rather than `long` increases your chance. – Jabberwocky Jul 04 '22 at 09:58
  • @Jabberwocky You can take a look at your compiler's documentation and see what all integer sizes are up to. – Zakk Jul 05 '22 at 05:16
-1

enter image description here

here you are store result in NUM3 and you result is not show in proper value because the value for 48 term is higher than limit of storing number in int data type. For this problem has solution to use long int data type for store big values. Here long keyword use before int for storing big precision values. The INTEGER data type stores whole numbers that range from -2,147,483,647 to 2,147,483,647 for 9 or 10 digits of precision.

-2

int can express up to 1836311903.

if you want to show 48th,

you should consider using long

JH_LEE
  • 3
  • 6
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jul 04 '22 at 17:50