首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

迭代法

2012-04-24 
迭代法-求救我写求sinx的迭代法计算程序,但运行结果不对,高手帮忙看看公式如下:sinxx-(x^3)/(3!)+(x^5)/(

迭代法-求救

我写求sinx的迭代法计算程序,但运行结果不对,高手帮忙看看
公式如下:
sinx=x-(x^3)/(3!)+(x^5)/(5!)+···+(-1)^n/(2n+1)! +···

输入1000应得-0.984808

输入的度数是不是要先转化为弧度

/***********************
*作业题目:sinx 求值
*
*作 者:**
*日 期:12-4-18
*程序功能:迭代法求值
*************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
int n = 0;//第几项
int i = 0;//循环计数
int x;//输入的度数
int change;//存放度数
float radian;//弧度制
const float PI = 3.14159265;
float xResult = 1;//x的(2n+1)次方结果
float jResult = 1;//(2n+1)的阶乘
float oResult = 0;//一项的结果
float result = 0;//结果

printf("请输入度数:");
scanf("%d",&x);
change = x % 360;
radian =((x * 0.1) / 360) * 2 * PI; //得到弧度

while(1)
{
for(i = 0;i < (2 * n + 1);i++)//2n+1个x相乘
{
xResult *= radian;//得到x的2n+1次方
}

for(i = (2 * n + 1);i > 0;i--)
{
jResult *= i;//得到(2n + 1)的阶乘
printf("%f-%d=",jResult,n);
}

if(0 == (n % 2))
oResult = xResult / jResult;
if(1 == (n % 2))
oResult = (-1) * (xResult / jResult);
result += oResult;
if(fabs(oResult) < pow(10,-7 * 1.0)) //退出循环的条件
break;
n++;
}

printf("sin(%d)的值是:%f\n",x,result);
system("pause");
return 0;
}

[解决办法]
调试跟踪下看看
[解决办法]
这个公式是要按弧度输入参数的。

radian =((x * 0.1) / 360) * 2 * PI;弧度计算错误,应写为:
radian =((change * 1.0) / 360) * 2 * PI; 

按你的公式,应该在每次进入循环后复位两个计算参数:
while(1)
{
xResult = 1;
jResult = 1;
否则得到的计算结果会偏差很远了。

其实你没必要每次都从头求这两个参数,可以从上一次的结果里直接求新值。

delt*=(flag=1-flag)*radian*radian/(n-1)/n;
n+=2;

热点排行