使用cpp中的裁缝系列计算coshx的值

时间:2018-05-09 12:23:29

标签: c++ function math physics factorial

我被分配了一项任务,使用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)和较少的循环次数。

1 个答案:

答案 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++;
}

正如其他人指出的那样,这实际上是指数的泰勒系列,但你只需要进行一些微小的修改即可得到理想的结果(例如跳过奇数)。