
c语言求sin(x)近似值的问题!
以下我写的,具体是想实现输入弧度x,误差u后,当误差小于u时,输出近似值。近似值是利用泰勒公式的,这样写一运行不管什么值都是溢出(-1.#INDOO),请问该怎么改,感觉...
以下我写的,具体是想实现输入弧度x,误差u后,当误差小于u时,输出近似值。近似值是利用泰勒公式的,这样写一运行不管什么值都是溢出(-1.#INDOO),请问该怎么改,感觉是不是do while函数用错了?应怎么改?新手还望大家指教!
#include<stdio.h>
#include<math.h>
int main()
{
double x,u,t;
int i,k=1;
double a=1.0,b=1.0;
double c=1.0,s=0.0;
scanf("&lf &lf",&x,&u);
do{for(i=1;i<=k+1;i++){
a = -a;}
for(i=1;i<=2*k-1;i++){
b = b*i;
c = c*x;}
s = s+a*c/b;
t = fabs(s-sin(x));
k++;
}while(t>=u);
printf("%lf",s);
return 0;
} 展开
#include<stdio.h>
#include<math.h>
int main()
{
double x,u,t;
int i,k=1;
double a=1.0,b=1.0;
double c=1.0,s=0.0;
scanf("&lf &lf",&x,&u);
do{for(i=1;i<=k+1;i++){
a = -a;}
for(i=1;i<=2*k-1;i++){
b = b*i;
c = c*x;}
s = s+a*c/b;
t = fabs(s-sin(x));
k++;
}while(t>=u);
printf("%lf",s);
return 0;
} 展开
5个回答
展开全部
#include<stdio.h>
#include<math.h>
int main()
{
double x,u,t;
int i,k=1;
double a=1.0,b=1.0;
double c=1.0,s=0.0 , s0=0;
scanf("%lf %lf",&x,&u);
do{
if ( k%2 ) //先正,后负
a = 1.0 ;
else
a = -1.0;
c=1,b=1; //b c的值应该每次都是从1开始
for(i=1;i<=2*k-1;i++)
{
b = b*i;
c = c*x;
}
s = s+a*c/b;
t=fabs(s-s0); //这里应该计算的是两次计算的差,而不应该调用sin(x),因为你的程序是为了计算sin(x)的近似值
s0=s ; //记录上次的计算结果
k++;
} while(t>=u);
printf("%lf",s);
return 0;
}
#include<math.h>
int main()
{
double x,u,t;
int i,k=1;
double a=1.0,b=1.0;
double c=1.0,s=0.0 , s0=0;
scanf("%lf %lf",&x,&u);
do{
if ( k%2 ) //先正,后负
a = 1.0 ;
else
a = -1.0;
c=1,b=1; //b c的值应该每次都是从1开始
for(i=1;i<=2*k-1;i++)
{
b = b*i;
c = c*x;
}
s = s+a*c/b;
t=fabs(s-s0); //这里应该计算的是两次计算的差,而不应该调用sin(x),因为你的程序是为了计算sin(x)的近似值
s0=s ; //记录上次的计算结果
k++;
} while(t>=u);
printf("%lf",s);
return 0;
}
追问
太棒了,成功了,但是想再问你一下b=1和c=1为什么要在do语句里面赋值一下才有效,我开始写的double a=1.0,b=1.0,double c=1.0,没意义么?还用用for(i=1;i<=k+1;i++){a = -a;}表示正负1为什么没有效果?
追答
b=1和c=1为什么要在do语句里面赋值一下才有效,我开始写的double a=1.0,b=1.0,double c=1.0,没意义么?
循环一次,b c就会发生变化了,看这里
for(i=1;i<=2*k-1;i++)
{
b = b*i;
c = c*x;
}
这个循环,导致b c不再是原来的b c了
第二次再循环,你想想,再用变化后了的b c运算,新bc变成什么数了?与公式中的数不同了,自己想想(或用笔算两个)就知道了
for(i=1;i<=k+1;i++) /
{
a = -a;
}
开始 a=1,k=1时,循环2次,a最后得1
第二次,a=1,k=2时,循环3次,a最后得-1
第三次,a=-1,k=3时,循环4次,a最后得-1 出问题了。。。。
展开全部
#include<stdio.h>
#include<math.h>
int
main()
{
double
x,u,t;
int
i,k=1;
double
a=1.0,b=1.0;
double
c=1.0,s=0.0
,
s0=0;
scanf("%lf
%lf",&x,&u);
do{
if
(
k%2
)
//先正,后负
a
=
1.0
;
else
a
=
-1.0;
c=1,b=1;
//b
c的值应该每次都是从1开始
for(i=1;i<=2*k-1;i++)
{
b
=
b*i;
c
=
c*x;
}
s
=
s+a*c/b;
t=fabs(s-s0);
//这里应该计算的是两次计算的差,而不应该调用sin(x),因为你的程序是为了计算sin(x)的近似值
s0=s
;
//记录上次的计算结果
k++;
}
while(t>=u);
printf("%lf",s);
return
0;
}
#include<math.h>
int
main()
{
double
x,u,t;
int
i,k=1;
double
a=1.0,b=1.0;
double
c=1.0,s=0.0
,
s0=0;
scanf("%lf
%lf",&x,&u);
do{
if
(
k%2
)
//先正,后负
a
=
1.0
;
else
a
=
-1.0;
c=1,b=1;
//b
c的值应该每次都是从1开始
for(i=1;i<=2*k-1;i++)
{
b
=
b*i;
c
=
c*x;
}
s
=
s+a*c/b;
t=fabs(s-s0);
//这里应该计算的是两次计算的差,而不应该调用sin(x),因为你的程序是为了计算sin(x)的近似值
s0=s
;
//记录上次的计算结果
k++;
}
while(t>=u);
printf("%lf",s);
return
0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要观察两个项之间的区别,
应是
-x*x/((i+1)*(i+2))
一个负号,这个一般用
flag*=-1来做,每次循环乘以-1来做到交替变换
让前一项乘上flag在成上x*x再除以((i+1)*(i+2))不就做到了
for(i=1;i<=k+1;i++){
a = -a;}
用这个求正负号对吗?a每次进入for循环的初始值不同,那么求出来应该是不对吧
正确的做法
s=x; //第一项不用算了,就是x
b=x;
int flag=1;
for(i=1;b>u;i+=2)
{
flag*=-1;
b*=x*x;
b/=(i+1)*(i+2);
s+=flag*b;
}
应是
-x*x/((i+1)*(i+2))
一个负号,这个一般用
flag*=-1来做,每次循环乘以-1来做到交替变换
让前一项乘上flag在成上x*x再除以((i+1)*(i+2))不就做到了
for(i=1;i<=k+1;i++){
a = -a;}
用这个求正负号对吗?a每次进入for循环的初始值不同,那么求出来应该是不对吧
正确的做法
s=x; //第一项不用算了,就是x
b=x;
int flag=1;
for(i=1;b>u;i+=2)
{
flag*=-1;
b*=x*x;
b/=(i+1)*(i+2);
s+=flag*b;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
#include<math.h>
int
main()
{
double
x,u,t;
int
i,k=1;
double
a=1.0,b=1.0;
double
c=1.0,s=0.0
,
s0=0;
scanf("%lf
%lf",&x,&u);
do{
if
(
k%2
)
//先正,后负
a
=
1.0
;
else
a
=
-1.0;
c=1,b=1;
//b
c的值应该每次都是从1开始
for(i=1;i<=2*k-1;i++)
{
b
=
b*i;
c
=
c*x;
}
s
=
s+a*c/b;
t=fabs(s-s0);
//这里应该计算的是两次计算的差,而不应该调用sin(x),因为你的程序是为了计算sin(x)的近似值
s0=s
;
//记录上次的计算结果
k++;
}
while(t>=u);
printf("%lf",s);
return
0;
}
#include<math.h>
int
main()
{
double
x,u,t;
int
i,k=1;
double
a=1.0,b=1.0;
double
c=1.0,s=0.0
,
s0=0;
scanf("%lf
%lf",&x,&u);
do{
if
(
k%2
)
//先正,后负
a
=
1.0
;
else
a
=
-1.0;
c=1,b=1;
//b
c的值应该每次都是从1开始
for(i=1;i<=2*k-1;i++)
{
b
=
b*i;
c
=
c*x;
}
s
=
s+a*c/b;
t=fabs(s-s0);
//这里应该计算的是两次计算的差,而不应该调用sin(x),因为你的程序是为了计算sin(x)的近似值
s0=s
;
//记录上次的计算结果
k++;
}
while(t>=u);
printf("%lf",s);
return
0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
scanf("%lf %lf",&x,&u);
追问
这个的确没注意,改了。但是这回精度只要差不多小于0.5还是会溢出,按理说double的精度不是很高的么,能在帮我看看么?
追答
按照以下的算法,t和s会逐渐增大,直到发生溢出,和输入的精度没有关系。
抱歉不太了解你的算法的根据……
do{for(i=1;i<=k+1;i++){
a = -a;}
for(i=1;i<=2*k-1;i++){
b = b*i;
c = c*x;}
s = s+a*c/b;
t = fabs(s-sin(x));
k++;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询