所以我写了一个标头,它使用递归来计算几个数学函数。包括余弦函数和指数函数(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
最佳答案
Unix或POSIX标准定义了一个名为bc
的工具,它是一个(非常基础的)多精度命令行计算器。随之而来的是一个数字库,它为exp,cos和sin等提供了明确的实现。研究有效,精确的算法。手册页,例如
http://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC18
从行exp(x)
开始包含define e(x)
的实现。
基本上,要使泰勒级数起作用,您首先必须将参数减小为尽可能接近零。 bc
主要使用对分和平方技术。对于正弦和余弦,也可以使用周期性和对称性。
完整的bc库可以在以下位置找到
http://code.metager.de/source/xref/gnu/bc/1.06/bc/libmath.b