【发布时间】:2020-02-04 19:21:46
【问题描述】:
我为泰勒级数编写了以下函数来计算余弦。
double cosine(int x) {
x %= 360; // make it less than 360
double rad = x * (PI / 180);
double cos = 0;
int n;
for(n = 0; n < TERMS; n++) {
cos += pow(-1, n) * pow(rad, 2 * n) / fact(2 * n);
}
return cos;
}
我的问题是,当我输入 90 时,我得到的答案是 -0.000000。 (为什么我得到 -0.000 而不是 0.000?)
谁能解释我为什么以及如何解决这个问题?
我认为这是由于双精度。
这是 main() :
int main(void){
int y;
//scanf("%d",&y);
y=90;
printf("sine(%d)= %lf\n",y, sine(y));
printf("cosine(%d)= %lf\n",y, cosine(y));
return 0;
}
【问题讨论】:
-
一个可能的罪魁祸首是您没有显示的打印程序。并且不要在包含 math.h 时创建名为
cos的变量。 -
我不确定您要询问的问题是什么。
cos(90)的值是 0。-0.000000本质上是 0。顺便说一句,有一种更有效的方法来计算连续项。每个术语只是-(rad * rad)/(2*n*(2*n-1))乘以前一个术语。因此,为此目的,在每次循环迭代中保存术语值。 -
使用
%g而不是%f,你会看到你的结果倾向于哪个值 -
由于
cos(90 + a little bit)是0 - a little bit,这种事情很可能发生。您的代码(可能)工作正常。 “永远不要比较浮点数是否相等。” -0 对于所有实际目的都足够接近 0。 -
Lurker,为什么我得到的是 -0.000 而不是 0.000?
标签: c precision trigonometry taylor-series