c - 递归段错误

标签 c gcc recursion polynomial-math

所以我写了一个 header ,使用递归来计算几个数学函数。包括余弦函数和指数函数(e^x)。现在,余弦函数工作得很好,但 e^x 会产生段错误,即使两者都使用相同的递归过程。这是我创建的头文件“c_math.h”中的代码:

#define PI 3.141592

static unsigned int n;


................

uint32_t Factorial(unsigned int p)
    {

        if(p==0){

            return(1);

        }else if(p>0){

            return p*Factorial(p-1);

        }       

    }; 


double EXP(double x)
    {

      int    N = n;
      double F = (double)Factorial(n);

      if(n==0){

           return (1.0);

      }else{

        return EXP(x)+(Pow(x,N)/F);

      }


    }

double cosine(double x)
{

    int    N = (2*n);
        double F = (double)(Factorial(2*n)*(-1^n));

    if(n==0){

        return(1.0);

    }else if(n==1){


      return 1+(Pow(x,2)/2);

    }else if(n>1){

      return cosine(x)+(Pow(x,N)/F);


    }

};


double cos(double x){

  bool halt = false;
  double COS;

  n = 0;


  while(halt==false){

     int    N = (2*n);
     double F = (double)(Factorial(2*n)*(-1^n));

     COS = cosine(x);

     if(abs(Pow(x,N)/F)<=0.0001){

            halt = true;

     }else{

         n++;
     }
  }

  return COS;

}

double e(double x){

      bool halt = false;
      double E;

      n = 0;


      while(halt==false){

        int    N = n;
        double F = (double)(Factorial(n));

        E = EXP(x);

        if(abs(Pow(x,N)/F)<=0.0001){

                halt = true;

         }else{

             n++;
         }
      }

      return E;

 }

.c文件的主要功能:

include <stdio.h>
#include <cmath.h>


int main()
{

  printf("\n");
  printf("cos(2.2) = %4.6f\n",cos(2.2));
  printf("\n");
  printf("e(2.2) = %4.6f\n",e(2.2));
  printf("\n");

}

编译它然后从终端提示符执行后,输出如下所示:

zermacr0yd@DALEK /usr/lib/gcc/x86_64-linux-gnu/4.7.3/include $ ./mathtest

cos(2.2) = -0.588501

Segmentation fault

正如您所看到的,余弦函数按其应有的方式工作,但 e^x 产生段错误。现在,函数 e^x 在 x > 0 时严格递增,在 x < 0 时严格递减,但从数学上讲,幂级数对于 x 的所有值都应该收敛,这意味着最终当级数索引 n 变得足够高时,第 n 项应低于 0.0001。那么这里发生了什么?

最佳答案

您的所有函数都使用变量n,我假设该变量是全局声明的,但仅在e 中本地定义。您应该为每个函数提供 n 的本地定义:int n = 0;

关于c - 递归段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314405/

相关文章:

c++ - 在 clang 中实例化后的静态成员初始化

c++ - 在 tbb 原子变量上进行位测试和设置 (BTS)

c - 在 GCC 4.6.1 (Ubuntu 11.10) 中链接数学库

gcc - Cortex-M3 的 CMSIS 库中的数据内存屏障 (DMB)

c++ - 如何解决由递归函数引起的堆栈溢出错误? C++

java - 循环从 0 到 100 的数字,并使用递归打印出每三个数字而不使用模函数

python - 使用python查找整数中数字总和的递归函数

c - Windows 驱动程序 - 在用户模式和内核模式之间传递字符串。动态大小的结构

c++ - 对于 C/C++,什么时候不使用面向对象编程有好处?

任何人都可以解释和追踪这个因为我的老师不能