c++ - 为什么我得到浮点异常

标签 c++ floating-point

我不认为我的代码中有任何要达到零或将其除以零所以任何人都可以帮助我为什么我得到输入 20 75 的浮点异常

我只是计算 2*n -1 的阶乘并将它与 n 和 n-1 的阶乘相乘,但我不知道我的代码在哪里变零或其他原因

int fact(int num) {
    if(num == 1 || num == 0) return 1;
    else return (num*fact(num-1));
}
int Solution::solve(int A) {
    int val1 = fact(A-1);
    int val2 = fact(A-1+A-1);
    int ans = (val2/((val1*val1)%1000000007))%1000000007;
    return (ans/A)%1000000007;
}

对于 A = 20 或 A = 75 我得到浮点异常

最佳答案

输入 A = 20 时,您调用 fact(20 - 1)fact(20 - 1 + 20 - 1),它们是 fact(19 ) 事实(38)。 19 的阶乘是 121645100408832000,38 的阶乘是 523022617466601111760007224100074291200000000。

在典型的 PC 上,int 的最大可表示值是 2147483647,它小于您尝试计算的上述任何一个阶乘。您的程序溢出了一个带符号的整数,并且程序的行为未定义。

I don't think there is any point in my code I am ... dividing it with zero

对于 val1 的某些值,

(val1*val1)%1000000007 可能为零。因此 val2/((val1*val1)%1000000007) 可能被零除。一个简单的情况是 val1 为零,另一个情况是 1000000007。您可能认为 val1 永远不可能是这两个值中的任何一个,因为它们不是阶乘,但当您在程序中签名溢出时,它们完全可以是任何一个值。

用 32 位整数表示的最大阶乘是 12!因此,您的函数可以解决的最大输入是 A = 7。

关于c++ - 为什么我得到浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150914/

相关文章:

c++ - 获取 range-v3 vector 对的交集

Java Math.pow 问题

c++ - 模板元编程 : "does not have integral or enumeration type"

python - 浮点值

c++ - 嵌套名称说明符中使用的不完整类型

c++ - Qt、tcp/ip通讯校验

c++ - QAbstractItemModel for QMetaObject,必须自己写吗?

c++ - 在 CUDA __constant__ 内存和多 GPU 上?

c++ - 函数 bool isnan( … ) 在 C++ 中的定点实现

ruby - 为什么 ruby​​ BigDecimal 表现出类似于 float 的表示不准确性?