计算余弦算法

时间:2012-01-19 06:57:45

标签: c algorithm cosine

我创建了这个函数CalculateCos

int Factorial (long int n)
{
    long int r = 1;
    for (int i = 2; i<=n; i++)
    {
        r = r*i;    
    }   

    return r;
}

float CalculateVariable(int CVnumber, int CVloopCounter)
{
    float CVresult = 0;
    CVresult = pow(CVnumber, (CVloopCounter*2)) / (long int)Factorial(CVnumber*2);

    return CVresult;
}

float CalculateCos(int number)
{
    float result = 1;
    int loopCounter = 1;
    int minusOrPlus = 1;
    while(loopCounter <= precision && loopCounter <= 8)
    {
        if(!minusOrPlus)
        {
            result = result - CalculateVariable(number, loopCounter);
            printf("%f\n", result);
            minusOrPlus = 1;
        }
        else
        {
            result = result + CalculateVariable(number, loopCounter);
            printf("%f\n", result);
            minusOrPlus = 0;
        }
        loopCounter++;
      }
      return result;
}

我在减法或添加后printf的原因是因为它给了我奇怪的输出,如:

Enter a number, for the cos function
6
1.000000
0.999997
1.000095
0.996588
1.122822
-3.421593
160.177368
-5729.385254
Result is: -5729.3852539
Official function result is:  0.9601703

你能帮助我在这方面得到正确的结果吗?

更新

现在我的解决方案是:

float CalculateCos(float number)
{
    float result = 0;
    float step = 1;
    int loopCounter = 1;

    while(loopCounter <= 5)
    {
        step = step * (-number) * number / (((2*loopCounter)-1)*((2*loopCounter)-2));
        result += step;
        loopCounter++;
    }

    return result;
}

1 个答案:

答案 0 :(得分:6)

当前问题:

由于您的Factorial函数返回int并将其强制转换为long int,因此即使在您的情况下输入到16之前,其结果也会溢出(14 !&gt; max_int)。

您使用泰勒系列计算cos

  

cos(x)= 1 - x 2 / 2! + x 4 / 4! - x 6 / 6!   + ...

我不会写代码。但是你的程序有些问题,可以轻松修复:

  1. 输入为弧度,因此number应为float
  2. 使用取幂和阶乘分别计算泰勒级数的每一步都会很快导致溢出。正确的方法是首先保持float变量:step = 1并且在k th 循环迭代step = step * (- x) * x / ((2*k-1)*(2*k))中。这样,您只需在循环中将step添加到result,就不再需要minusOrPlus
  3. 循环迭代的数量受8的限制,这个数字太小,因此结果可能不够精确。
  4. 我没有看到你在任何地方使用precision变量。它可用于检查结果的精度。例如,当abs(step) < precision时,我们将终止循环。