我创建了这个函数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;
}
答案 0 :(得分:6)
当前问题:
由于您的Factorial
函数返回int
并将其强制转换为long int
,因此即使在您的情况下输入到16
之前,其结果也会溢出(14 !&gt; max_int)。
您使用泰勒系列计算cos
:
cos(x)= 1 - x 2 / 2! + x 4 / 4! - x 6 / 6! + ...
我不会写代码。但是你的程序有些问题,可以轻松修复:
number
应为float
。float
变量:step = 1
并且在k th 循环迭代step = step * (- x) * x / ((2*k-1)*(2*k))
中。这样,您只需在循环中将step
添加到result
,就不再需要minusOrPlus
。8
的限制,这个数字太小,因此结果可能不够精确。precision
变量。它可用于检查结果的精度。例如,当abs(step) < precision
时,我们将终止循环。