【问题标题】:Gaussian integral in C++ is not working. Why?C++ 中的高斯积分不起作用。为什么?
【发布时间】:2017-10-01 08:47:59
【问题描述】:

这是我的代码:

const double kEps(0.00000001);
    double gaussianIntegral(double x)
    {
        double res(x), numerator(x);
        for(unsigned int i(1), k(3); (abs(numerator/k) > kEps) || (res < 0); ++i, k+=2)
        {
            numerator*=(-x*x/i);
            res+=numerator/k;
        }
        return res;
    }

这是我要计算的内容:

当我尝试将 30 作为参数传递时,我的计算将永远进行下去。怎么了?我非常卡住,对我来说似乎没有错误,一切都应该正常工作,但事实并非如此。

【问题讨论】:

  • 你调试过你的代码吗?通过在脑海中反复思考它是如何工作的?这段代码非常简单,问题显然出在你的 for 循环条件中。没什么特别的。
  • @VictorPolevoy,是的,我尝试调试它。没有帮助我。
  • 您的代码与 C 无关。不要垃圾标签。
  • 这也不是关于 C++,而是关于数值算法。 SO 完全是错误的网站。
  • “我试图调试它。没有帮助我。”那是没有意义的。你尝试了什么?最低限度是在每一步打印分子的值,这使得问题显而易见。

标签: c++ int double precision


【解决方案1】:

虽然形式上泰勒级数收敛,但在实践中,即使参数小至 0.1(即使用 kEps=0),您也会遇到机器精度限制

最好使用(适当缩放)std::erf (C++11),或者如果是家庭作业,请查找计算 erf 函数的算法,例如这里:https://math.stackexchange.com/questions/97/how-to-accurately-calculate-the-error-function-erfx-with-a-computer

【讨论】:

  • 它说命名空间std没有成员erf。
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 2016-01-12
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多