利用级数展开式计算求cos(x) 的近似值(精度为10-6) 不知道问题出在哪
本帖最后由 jack_straw_man 于 2019-11-7 15:29 编辑#include<stdio.h>
#include<math.h>
int main()
{
double k=1;
double dcos=1,x;
printf("请输入x:");
scanf("%f",&x);
for(;pow(x,2*k)/factorial(2*k)>=1e-6;k++)
{
dcos = dcos + pow(-1,k)*pow(x,2*k)/factorial(2*k);
}
printf("cos(x) = %.6f",dcos);
}
int factorial(int num) /*求num的阶乘*/
{
int fact = 1;
for(;num>0;num--)
{
fact = fact*num;
}
return fact;
}
开始做的时候还能有四位精度 后面改着改着就彻底没了{:10_266:} 就这么一道题卡了两个多小时 我人要傻了 求大佬救我{:10_266:} #include<stdio.h>
#include<math.h>
int main(void)
{
int k , m , n ;
double dcos , cosx , x ;
printf("请输入 x : ") ;
scanf("%lf" , & x) ;
for(cosx = 1.0 , n = 2 ;; n += 2) {
for(m = 1 , k = 0 ; k < n ; k ++) m *= (k + 1) ;
dcos = pow(x , n) / m ;
if(! (n % 4)) cosx += dcos ;
else cosx -= dcos ;
if (dcos < 1e-6) break ;
}
printf("cos(%lf) = %lf\n" , x , cosx) ;
}
jackz007 发表于 2019-11-7 15:32
跟我开始做的结果是一样的{:10_250:}
输入的数差不多大于3以后就不对了
请输入 x : 3
cos(3.000000) = -0.540983
请输入 x : 100
cos(100.000000) = 1113098911124171900000000000.000000
然后我改一改 就再也不对了{:10_285:} 算法不能动,修改的余地也就仅限于循环结束的条件:
if (dcos < 1e-6) break ;
最多改成这样:
if (dcos < 1e-16) break ; jackz007 发表于 2019-11-7 15:53
算法不能动,修改的余地也就仅限于循环结束的条件:
最多改成这样:
嗯 我刚学c很多地方都不懂(=_=)
不过你程序的格式看着好舒服呀
我得学习学习
顶了 本帖最后由 jack_straw_man 于 2019-11-8 19:35 编辑
我在你的程序基础上改了一下吧x^2k/2k! 换了一个算法单项除再相乘 要好一点 #include<stdio.h>
#include<math.h>
int main(void)
{
int k, n ;
double dcos , cosx , x, m ;
printf("请输入 x : ") ;
scanf("%lf" , & x) ;
x = fmod(x,2*3.1415926535);
if(fabs(x)>=3.1415926535)x = 2*3.1415926535-x;
for(cosx = 1.0 , n = 2 ;; n += 2) {
for(m = 1 , k = 0 ; k < n ; k ++) m *= x/(k + 1) ;
dcos = m ;
if(! (n % 4)) cosx += dcos ;
else cosx -= dcos ;
if (dcos < 1e-6) break ;
}
printf("cos(%lf) = %.6f\n" , x , cosx) ;
}
页:
[1]