2012-01-19 99 views
0

我创造了这个功能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 

你能帮忙我得到正确的结果呢?

UPDATE:

现在我的解决办法是:

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; 
} 
+3

帮助什么?你甚至没有说出什么问题,更不用说你还没有发布一个独立的例子。 –

+0

我认为有些东西正在溢出或下溢。 –

+0

请保留原始代码并添加新的代码作为更新的部分。它有助于他人理解你的问题的背景。 – pad

回答

6

目前存在的问题:

因为你Factorial函数返回int,你把它强制转换到long int,其结果是要溢出甚至在你的情况下输入为16(14!> max_int)之前。

您使用的泰勒级数计算cos

COS(X)= 1 - X /2! + x /4! - x /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时,我们要终止循环。
+0

我更新了我原来的帖子,那是你的想法? –

+0

对不起我的错字:它应该是'2 * k'而不是'2 * k-2'(我更新了我的答案)。 'loopCounter'的限制应该比'5'大很多。除此之外,你的代码看起来是正确的。尝试测试它并与内置的“cos”功能进行比较。 – pad

+0

垫,工作完美!非常感谢你! :) –