首页 > 解决方案 > 为什么我得到浮点异常

问题描述

我认为我的代码中没有任何一点我达到零或将其除以零所以任何人都可以帮助我为什么我得到输入 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,我得到浮点异常

标签: c++floating-point

解决方案


输入 A = 20,您调用fact(20 - 1)并且fact(20 - 1 + 20 - 1)fact(19) fact(38). 19 的阶乘是 121645100408832000,38 的阶乘是 523022617466601111760007224100074291200000000。

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

我认为我的代码没有任何意义...将其除以零

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

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


推荐阅读