here is my code :
using integer = int64_t;
integer factorial(integer number) {
return number <= 0 ? 1 : number * factorial(number - 1);
}
integer binomial_coefficent(integer n, integer r) {
return factorial(n) / (factorial(r) * factorial(n - r));
}
int main()
{
using namespace std;
cout << binomial_coefficent(40, 20) << endl;
return 0;
}
this prints
0
which is wrong answer but if i change integer type to double that will print 1.37847e+11
which is the correct answer,my question is why using int64_t gives me incorrect answer
and int64_t doesn't overflow either
It does though. For debugging things like this, you can run this with -fsanitize=signed-integer-overflow
(implied by -fsanitize=undefined
) in GCC or clang to see:
runtime error: signed integer overflow: 21 * 2432902008176640000 cannot be represented in type 'long'
runtime error: signed integer overflow: 2432902008176640000 * 2432902008176640000 cannot be represented in type 'long'