求高手指点c语言的题

来源:百度知道 编辑:UC知道 时间:2024/05/07 10:32:40
帮我看看这个程序哪里错了,运行怎么不对啊!
编sinx=x-x^3/3!+x^5/5!-x^7/7!+…… 算到第十项
我是这样想的
#include "stdio.h"
void main()
{
double x,sum;
int y,n,z,i;
y=1;z=1;n=1;
printf("input the number:\n");
scanf("%lf",&x);
sum=x;
for(i=2;i<=10;i++)
{
n+=2;y=n*(n-1);
x*=x*x;
z*=-1;
sum+=x*z/y;
}
printf("the result is%lf",sum);
}
为什么不对呢????
x*=x*x这个的确不对,但是后面算阶乘的应该没问题!而且就算改过来再试,用3.14做试验得到的居然是-0.9几!
我问老师,老师说是公式有问题!但是我的确不知道泰勒展开式有什么问题,希望各位大哥大姐指导一下!

你算阶乘和x的n次幂的算法都有问题。
先说阶乘,应该是
y*=n*(n-1)
当n为3时y=3*2
当n为5时y=5*4*刚才的y.这样就没错了。要不你那个只是y=n*(n-1)

而x*=x*x就更不是算n次幂的方法了。
当x为5时,计算为x*=x*x是没问题的。这时x=125
但到了下一步,x=125*125*125=5^9,显然不对。应该定义一个m,一开始让m=x,然后m*=x*x才对。
最后程序应该是这样(只写了主要部分的)
double m = x;
for(i=2;i<=10;i++)
{
n+=2;
y*=n*(n-1);
m*=x*x;
z*=-1;
sum+=x*z/y;
}
你试一下吧

循环步长是2,递推 t = t * x * x

void main()
{
double t=1.0;
double y = 1.0;
double x;
double sum=0;
int i;

x= 3.1416 / 4.0; // 用45度做试验
t = x;
sum = t;
for (i=3;i<10;i=i+2)
{
t = t * x * x * (-1.0);
y = y /(double) i / (double) (i-1) ;
sum = sum + t * y;
};

printf("%lf ",sum);
}