我正在使用代码来计算十进制数字的余弦(弧度(。问题在于,只有在我放置少量数字时才能得到正确的答案。它使用泰勒系列。
double coseno(float x)
{
double t = x;
double cos= t;
for ( int a=1; a<20.0; ++a)
{
double mult = -x*x/((2*a)*(2*a-1));
t *= mult;
cos += t;
}
return cos;
}
- 你犯了一个错误。开始时,您应该将t设置为1(不是x(;
- 您忘记了术语。如果数字太大或太小,您可以简单地使用一些hiles。
最终它可以很好地工作:
#include <math.h> //for M_PI
double coseno(float x){
while(x<0) x+=2*M_PI;
while(x>2*M_PI) x-=2*M_PI;
double t = 1;
double cos= t;
for ( int a=1; a<40; ++a)
{
double mult = -x*x/((2*a)*(2*a-1));
t *= mult;
cos += t;
}
return cos;
}
我认为问题是当您使用所需的精度评估操作时,该操作不会评估。当您使用小值时,近似足以获得正确的结果,但是当您使用较大的值时,您会陷入近似问题。
您在for循环中多次重复近似错误,因此随着输入增加而获得错误结果