acos源码编译
㈠ 求函数sqrt,asin,acos源代码
/*
*sqrt源代码
*/
double my_sqrt(double x)
{
register double ret;
__asm__(
"fsqrt"
: "=t" (ret)
: "0" (x)
);
return ret;
}//计算x的平方根
/*
*asin源代码
*/
double atan2 (double x, double y)
{
register double ret;
__asm__(
"fpatan\n\t"
"fld %%st(0)"
: "=t" (ret)
: "0" (y), "u" (x)
);
return ret;
}//求x / y的反正切值。
double my_asin(double x)
{
return atan2 (x, sqrt (1.0 - x * x));
}//求x的反正弦值。
/*
*acos源代码
*/
double atan2 (double x, double y)
{
register double ret;
__asm__(
"fpatan\n\t"
"fld %%st(0)"
: "=t" (ret)
: "0" (y), "u" (x)
);
return ret;
}//求x / y的反正切值。
double my_acos(double x)
{
return atan2 (sqrt (1.0 - x * x), x);
}//求x的反余弦值。
/***********************/
以上是你要求的源代码,如果你要自己来实现,可以参考数值计算或数值逼近
sqrt:可以使用牛顿迭代公式,f(x)=x^2 - a
求零点(即方程f(x)=0的根),就是开方了。
而对于后面的两个,sin cos exp 是用泰勒公式和麦克劳林公式来计算,通过这里演化迭代就可以了,对于任何的c还是c++的编译器,在库函数里面都应该有这些基本的数学函数的,你在使用的时候加上#include<math.h>就可以了
㈡ 怎样用C语言编写数学公式
1、C语言有现场的常用数学函数,所在函数库为math.h、stdlib.h。
函数名及解释:
int abs(int i) 返回整型参数i的绝对值
double cabs(struct complex znum) 返回复数znum的绝对值
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
double exp(double x) 返回指数函数ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中
double ldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回xy的值
double pow10(int p) 返回10p的值
double sqrt(double x) 返回+√x的值
double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度
double atan(double x) 返回x的反正切tan-1(x)值,x为弧度
double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度
double cos(double x) 返回x的余弦cos(x)值,x为弧度
double sin(double x) 返回x的正弦sin(x)值,x为弧度
double tan(double x) 返回x的正切tan(x)值,x为弧度
double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度
double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度
double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度
double hypot(double x,double y) 返回直角三角形斜边的长度(z),x和y为直角边的长度,z2=x2+y2
2、复杂的数学函数可以用自定义函数的形式实现。
例如:
doubleConerVelocity(intA,doublex1,doubley1,doublex2,doubley2,doublet1,doublet2)
{
doubleT,V;
T=acos(abs(x1*x2+y1*y2)/sqrt(x1*x1+y1*y1)/sqrt(x2*x2+y2*y2));
V=(A*(t2-t1))/(2*sin(T/2));
returnV;
}