我正在尝试使用C程序通过maclaurin系列实现我自己的sin(x)函数, 这就是我到目前为止所做的一切,我先把所有东西都写在纸上然后我试着用代码实现它
#include<stdio.h>
#define PI 3.141592653589793238462643383
int main()
{
int x,nOfterms,term=1,i,j;
double numerator,sum=0.0,radius;
long int denominator;
printf("\n\t\tINPUT:");
printf("\n\t\t------");
printf("\n\t\tEnter the value for x in degrees: ");
scanf("%d",&x);
printf("\n\t\tEnter the value for number of terms: ");
scanf("%d",&nOfterms);
printf("\n\t\tOUTPUT:");
printf("\n\t\t-------");
radius=x*(PI/180.0);
printf("\n\t\tThe radius value for the given x value is: %lf",radius);
for(i=1;i<=nOfterms;i+=2)
{
numerator=1.0;
denominator=1;
for(j=1;j<=i;j++)
{
numerator=numerator*radius;
denominator=denominator*j;
}
sum=(sum+numerator)/(denominator*term);
term=term*-1;
}
printf("\n\t\tThe value for sin %d is: %lf",x,sum);
printf("\n\n\n");
return 0;
}
我的代码中根本不能使用math.h,教授说, 我的输出都是零,这显然是不对的,我也很感激,如果有人可以帮我这个,也有人可以提供一种方式,我可以在屏幕上看到屏幕上每个系列的每个项目的每次迭代在答案中,试图将最后一个printf放在for循环中,但我最终会得到奇怪的符号和数字。
答案 0 :(得分:1)
Mac Laurin系列的实施中存在的问题。这条线
sum=(sum+numerator)/(denominator*term);
错了。应该简单地说:
sum += numerator/denominator*term;
剩下的很好。我试过了,发现sin(30)= 0.5,sin(60)= 0.866甚至sin(90)~1。
但是你的algorythm效率不高,因为对于每个术语,你从1/1开始回到i n / i的第一个元素!已经在前一学期计算过了。
您可以将循环更改为:
numerator=1.0;
denominator=1;
j = 1;
for(i=1;i<=nOfterms;i+=1)
{
numerator=numerator*radius;
denominator=denominator*j++;
sum += numerator/denominator*term;
term=term*-1;
numerator=numerator*radius;
denominator=denominator*j++;
}
测试并给出相同(正确)的结果。
答案 1 :(得分:0)
以下是您的代码可以帮助您解决的一些问题:
您希望在计算条款数量时将i
增加1,而不是2。
对于每个术语,您只需要x
的奇数幂,因此它需要增加2 {更改上限和分母因子计算)
这一行错误:j
,大概应为sum=(sum+numerator)/(denominator*term);
希望这有助于你的任务。
答案 2 :(得分:0)
您的内部for
循环不正确。手动追踪i
的几个值:
1: numerator=radius, denominator=1 (correct)
2: numerator=radius, denominator=1 (incorrect)
3: numerator=radius*radius, denominator=3 (incorrect)
正确的内循环应该是:
for (j = 1; j < i*2; ++j)
{
numerator = numerator * radius;
denominator = denominator * j;
}