c++ - 为什么使用 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 会给我错误的答案
解决方案
并且 int64_t 也不会溢出
不过确实如此。要调试这样的事情,您可以在 GCC 或 clang 中使用-fsanitize=signed-integer-overflow
(由 暗示)运行它以查看:-fsanitize=undefined
运行时错误:有符号整数溢出:21 * 2432902008176640000 不能用“long”类型表示
运行时错误:有符号整数溢出:2432902008176640000 * 2432902008176640000 不能用“long”类型表示
推荐阅读
- reactjs - 反应选择 mapPropsToValues
- redis - 你能在 REDIS 中订阅 flushall 通知吗
- python - 朴素贝叶斯分类器不适用于情感分析
- go - 测试无法捕获日志输出
- c - 内联汇编中匹配约束有什么用
- c++ - 如何使用代码自动将线条艺术与背景隔离开来。有办法吗?
- google-apps-script - 将日期从表格复制到具有格式的文档
- android - 如何在 Android 10 上添加 FLAG_SECURE - Flutter
- c++ - 如何在 VSCode 中分析函数的性能
- reactjs - react-cleaning 自动完成会产生错误