我被分配了一项任务,使用CPP中的裁缝系列来计算coshx的值。 我通过使用阶乘和幂函数尝试了一种简单的方法,但是我注意到,在较大的x值下,阶乘行为突然发生并且给出非常偏离的值 这是我的代码
- traefik.app_admin.frontend.rule=Host:app.test;PathPrefix:/admin
- traefik.app_admin.frontend.auth.basic=dev:$$2y$$05$$3Zmx7gYh6mBIIm8O9HTR2uDkoYoRbTMfZpKup5NhmioKrU1YKgmqC
- traefik.app_api.frontend.rule=Host:app.test;PathPrefix:/api
- traefik.app_api.frontend.auth.basic=dev:$$2y$$05$$3Zmx7gYh6mBIIm8O9HTR2uDkoYoRbTMfZpKup5NhmioKrU1YKgmqC
- traefik.app_frontend.frontend.rule=Host:app.test
即使我已经使用long double来获取最大位但是没有任何改变,它只适用于较少的值(小于10)和较少的循环次数。
答案 0 :(得分:1)
如评论中所述,由于溢出,您会得到错误的结果。阶乘特别容易溢出,因为它的增长非常快。事实是,草率地讲,这种极端的增长是使泰勒系列融合的原因。如果考虑在每次迭代中添加的完整术语,它实际上会转到0
,而不是向无穷大增长(因子是分母)。
不是单独计算x
和阶乘的幂,而是应该不断更新整个术语,即代替
sum = sum + (pow(a, c) / fact(c));
// ^ this may grow very fast
// ^ this definitely grows extremely fast
你应该按照
的方式做点什么double add = x;
double factor = 1;
while (add > eps) { // with some appropriate value for eps
sum += add;
add *= (x / factor); // <-- this will nicely converge to 0
factor++;
}
正如其他人指出的那样,这实际上是指数的泰勒系列,但你只需要进行一些微小的修改即可得到理想的结果(例如跳过奇数)。