jack_straw_man 发表于 2019-11-7 14:32:57

利用级数展开式计算求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;
}

jack_straw_man 发表于 2019-11-7 14:34:18

开始做的时候还能有四位精度   后面改着改着就彻底没了{:10_266:}

jack_straw_man 发表于 2019-11-7 14:39:45

就这么一道题卡了两个多小时   我人要傻了      求大佬救我{:10_266:}

jackz007 发表于 2019-11-7 15:32:27

#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)                  ;
}

jack_straw_man 发表于 2019-11-7 15:40:44

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:}

jackz007 发表于 2019-11-7 15:53:34

      算法不能动,修改的余地也就仅限于循环结束的条件:
                if (dcos < 1e-6) break                         ;
      最多改成这样:
                if (dcos < 1e-16) break                         ;

jack_straw_man 发表于 2019-11-7 16:59:34

jackz007 发表于 2019-11-7 15:53
算法不能动,修改的余地也就仅限于循环结束的条件:

      最多改成这样:

嗯   我刚学c很多地方都不懂(=_=)
不过你程序的格式看着好舒服呀
我得学习学习
顶了

jack_straw_man 发表于 2019-11-8 19:31:42

本帖最后由 jack_straw_man 于 2019-11-8 19:35 编辑

我在你的程序基础上改了一下吧x^2k/2k! 换了一个算法单项除再相乘   要好一点

jack_straw_man 发表于 2019-11-8 19:35:38

#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]
查看完整版本: 利用级数展开式计算求cos(x) 的近似值(精度为10-6) 不知道问题出在哪