计算sin(x)作为c ++中的序列形式

时间:2011-09-17 06:13:30

标签: c++

我们知道    的sin(x)= X-X ^3分之3!+的x ^ 10/10!-x ^7分之7!+的x ^9分之9!等等。我写了这段代码:

#include <iostream>
#include <math.h>
using namespace std;

const int m=19;

int factorial(int n) {

    if (n==0){ return 1;}
    return n*factorial(n-1);
}

int main() {
   float x;
   cin >> x;

   float sum=0;
   int k=1;
   for (int i=1;i<=m;i+=2) {
      sum+=(k*(powf(x,i)/factorial(i)));
      k=k*(-1);
   }

   cout<<"series sum is equal :"<<sum<<endl;
   return 0;
}

一个问题是当我输入x = 3时它给了我-10.9136,但我知道sin(x)的值范围是[-1,1]是什么问题?请帮帮我。

1 个答案:

答案 0 :(得分:4)

问题在于由于破坏性取消而导致精度不足。

你有一个交替的系列,其中一些术语变得非常大。但是那些条款相互抵消了一个小的结果。由于float精度有限,因此您的舍入误差大于最终值。

您可以使用双精度“减少”问题。但它不会消失。 sin/cos的标准实现涉及通过2 pi获取参数的模数以使其变小。

编辑:

我发现了另一个问题。 i = 19时,您的阶乘函数中存在整数溢出。