【问题标题】:numerical precision in recursive functions递归函数的数值精度
【发布时间】:2016-11-17 05:39:32
【问题描述】:

我很困惑,在评估以下函数时,它会产生直到 F(0.8, 172, 1) 的数字,但是当我将 172 增加到 173 时,结果变得无限。我怀疑存在数值精度问题?

double F(double d, int c, int t) {
    // base cases
    if ((c==1 && t==1) || (c==0 && t==0))
        return 1.;
    if (c==0 || t==0)
        return 0.;
    if (t>c)
        return 0.;
    return F(d,c-1,t-1) + (c-1 - t*d)*F(d,c-1,t);
}

【问题讨论】:

  • 你能解释一下这是做什么的吗?
  • 我认为这里没有精度问题。原因是因为双精度没有被用作此函数中的任何地方的条件。也许真正的错误在其他地方?
  • floating-point-gui.de/formats/fp 所以你实际上是对的,这是double 数值精度的问题(从某种意义上说,它在各个方面都受到限制 - 当然,你只能将这么多数字放入 64 位)。

标签: c++ precision numerical


【解决方案1】:

我不知道你的函数应该做什么,但是给定参数:F(0.8, 172, 1) 返回值是 4.41861e+306,这只是小于 double 可以表示的最大值:

// 1.79769e+308
std::cout << std::numeric_limits<double>::max() << std::endl;

172 替换为173 时,返回值超过double 可以表示的最大值,变为正无穷大。这可以通过将F 的返回类型更改为long double 来明确,这会导致值7.56466e+308

【讨论】:

  • @bansi,这个数字一直偏右,起初我以为你在指出一个错误,然后我才意识到7.56466e+308 就是这么大,哈哈。 std::cout 给出科学计数法
  • long double 不一定比double
猜你喜欢
  • 2017-12-05
  • 2013-12-08
  • 2021-12-26
  • 2015-07-28
  • 2021-11-20
  • 1970-01-01
  • 2018-10-07
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多