1除以非常大的数字返回0,C

时间:2013-07-11 00:11:01

标签: c double division gaussian

我决定发布这个问题,因为我不确定为什么我会得到这个结果。我在这个网站上研究过,其他人没有找到解决办法。对不起,如果我违反了这个网站规则,但记住,我是新的。 这是用C编写的函数的代码,它返回意外的结果:

double gauss (double average, double variance, int data)
    {
    double model,power;
    power = ((((data-average)*(data-average))/(2*variance))*(1));
    model = (pow(E,(int)power));
    return 1.0/model;
    }

我不知道我是否应该发布我的其余代码,但如果你愿意的话,我会这样做,我只想保持帖子简短。问题出现在1.0 / model上,因为模型是一个非常大的数字。

3 个答案:

答案 0 :(得分:0)

C双精度具有有限的精度,因此如果将1.0除以非常大的双精度,则精度误差将净为0(实际上,实际答案非常接近零,精度误差将舍入为零)。

您可以尝试使用long double来获得更高的精确度,但我认为您最好使用像GMP这样的任意精度库。

答案 1 :(得分:0)

权力值必须趋于无穷大,因为它给出结果0.正如@ jh314所建议的那样,对所有变量尝试long double。它会增加模型变量&的范围。可能会给出任何准确的结果。

答案 2 :(得分:0)

这里的问题不是使用科学符号来打印数字,这使我相信实际值为零。