Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Factorial loop results are incorrect after the 5th iteration

Tags:

java

I am currently taking pre-calculus and thought that I would make a quick program that would give me the results of factorial 10. While testing it I noticed that I was getting incorrect results after the 5th iteration. However, the first 4 iterations are correct.

public class Factorial
{
    public static void main(String[] args)
    {

        int x = 1;
        int factorial;

        for(int n = 10; n!=1; n--)
        {

            factorial = n*(n-1);
            x = x * factorial;
            System.out.printf("%d ", x);

        }

    }//end of class main
}//end of class factorial

Why am I getting negative values

like image 362
Itchy Nekotorych Avatar asked Nov 30 '22 13:11

Itchy Nekotorych


1 Answers

That is an Integer Overflow issue. Use long or unsigned long instead of int. (And as @Dunes suggested, your best bet is really BigInteger when working with very large numbers, because it will never overflow, theoretically)

The basic idea is that signed int stores numbers between -2,147,483,648 to 2,147,483,647, which are stored as binary bits (all information in a computer are stored as 1's and 0's)

Positive numbers are stored with 0 in the most significant bit, and negative numbers are stored with 1 in the most significant bit. If your positive number gets too big in binary representation, digits will carry over to the signed bit and turn your positive number into the binary representation of a negative one.

Then when the factorial gets bigger than even what an unsigned int can store, it will "wrap around" and lose the carry-over from its most significant (signed) bit - that's why you are seeing the pattern of sometimes alternating positive and negative values in your output.

like image 196
sampson-chen Avatar answered Dec 04 '22 17:12

sampson-chen