首页 > 解决方案 > 为什么使用 int64_t 会给出错误的结果,而对于简单的整数乘法来说,double 可以按预期工作

问题描述

这是我的代码:

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;
}

这打印

0

这是错误的答案,但是如果我将整数类型更改为双精度,那将打印1.37847e+11 出正确的答案,我的问题是为什么使用 int64_t 会给我错误的答案

标签: c++intdoublefactorial

解决方案


并且 int64_t 也不会溢出

不过确实如此。要调试这样的事情,您可以在 GCC 或 clang 中使用-fsanitize=signed-integer-overflow(由 暗示)运行它以查看:-fsanitize=undefined

运行时错误:有符号整数溢出:21 * 2432902008176640000 不能用“long”类型表示
运行时错误:有符号整数溢出:2432902008176640000 * 2432902008176640000 不能用“long”类型表示


推荐阅读