为什么我会出现浮点异常

时间:2019-09-28 23:01:07

标签: 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,我正在获得浮点异常

2 个答案:

答案 0 :(得分:1)

在输入A = 20的情况下,调用fact(20 - 1) fact(20 - 1 + 20 - 1)的{​​{1}}和fact(19)。 19的阶乘是121645100408832000,38的阶乘是523022617466601111760007224100074291200000000。

在典型的PC上,fact(38)的最大可表示值是2147483647,该值小于您尝试计算的上述因子之一。您的程序溢出了一个有符号整数,并且该程序的行为未定义。

  

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

对于某些int值,

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

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

答案 1 :(得分:0)

我不能添加太多,但是如果您将所有int var = ...变量更改为 long long int var = ... (虽然我认为根据Google的风格指南不建议使用long long int),但由于{ 先前的评论:

20