这是我的代码:
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作为参数传递时,我的计算将永远失败。怎么了?我非常困惑,对我来说似乎没有错误,一切都应该正常工作,但事实并非如此。
最佳答案
尽管正式的泰勒级数收敛,但实际上,即使参数小到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