不用math.h文件实现计算tan函数

算法代码

#include "stdafx.h"
#include <stdio.h>
#define pai 3.14159265
#define accuracy 0.000001

double absolute(double x)//绝对值
{
	if(x<0)x=-x;
	return x;
}

double Factorial(int x)//阶乘
{
	if(x==1||x==0)return 1;
	else
		return 1.0*x*Factorial(x-1);
}


double nth(double x,int n)//n次方
{
	if(n>0)
	{
		return x*nth(x,n-1);
	}
	if(n==0)
	{		
		return 1;
	}
	if(n<0)
	{
		return (1/x)*nth(x,n+1);
	}
}
double Bernoulli(int x)//伯努利数
{
	int k=x;
	double B=0;
	if(x==0)
		return 1;
	else
		if(x>1&&x%2==1)
		{
			return 0;
		}
		else
		{
			while(k)
			{
				k--;
				B += -1.0 * ( Factorial(x) * Bernoulli(k) )/( Factorial(x-k) * Factorial(k) * (x-k+1) ) ;							
			}
			return B;
		}
}
double tanx(double x)//tan(x)  精度保持0.000001 计算速度太慢
{
    int i=1;
	double e=1,sum=0;
	while(x<(-pai/2))x+=pai;	
	while(x>(pai/2))x-=pai;
	if(x==(pai/2))
	{
		printf("\t不存在\n");
		return 0;
	}
    while(absolute(e)>accuracy&&i<=24)//考虑计算速度,控制Bernoulli()
    {
		e=1.0* (nth(-1,i-1) * nth(2,2*i) * (nth(2,2*i)-1.0) *Bernoulli(2*i)*nth(x,2*i-1))/(Factorial(2*i));
		sum+=e;	
		i++;		
    }
    return sum;
}


int main(){
	printf("%lf \n",tanx(pai/8));
	printf("%lf \n",tanx(pai/6));
	printf("%lf \n",tanx(pai/4));
	printf("%lf \n",tanx(pai/3));
	printf("%lf \n",tanx(pai/2));
	return 0;
}

测试结果

在这里插入图片描述

结果看来精度还过得去

猜你喜欢

转载自blog.csdn.net/qq_39464369/article/details/88556873