計(jì)算反正切函數(shù)(使用歐拉變換公式,精度很高),反正切函數(shù)的級(jí)數(shù)展開公式:
海滄網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,海滄網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為海滄千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的海滄做網(wǎng)站的公司定做!
f(x) = x - x^3/3 + x^5/5 +...+ (-1)^k * x^(2k+1)/(2k + 1)+...
當(dāng)|x| 1時(shí),級(jí)數(shù)絕對(duì)值發(fā)散,無法直接使用歐拉公式計(jì)算。因此可以通過下面的公式
進(jìn)行等價(jià)轉(zhuǎn)換之后再進(jìn)行計(jì)算。
等價(jià)轉(zhuǎn)換公式:
a) ATan(1/x) = Pi/2 - ATan(x)
b) ATan(-x) = - ATan(x)
特殊情況
0 = ArcTan(0)
Pi/2 = ArcTan(無窮大)
//
// 歐拉公式
//
// sum是和,term是通項(xiàng)值,jterm初始為1,以后按1遞增。wrksp是工作單元,視jterm的
// 最大值而定。
//
void eulsum(int nterm,double *sum,double term,int jterm,double wrksp[])
{
double tmp,dum;
if(jterm == 1)
{
nterm = 1;
wrksp[1] = term;
*sum = 0.5 * term;
}
else
{
tmp = wrksp[1];
wrksp[1] = term;
for(int j=1; j = nterm; j++)
{
dum = wrksp[j+1];
wrksp[j+1] = 0.5 * (wrksp[j] + tmp);
tmp = dum;
}
if(fabs(wrksp[nterm + 1]) = fabs(wrksp[nterm]))
{
*sum = *sum + 0.5 * wrksp[nterm + 1];
nterm = nterm + 1;
}
else
{
*sum = *sum + wrksp[nterm + 1];
}
}
}
級(jí)數(shù)計(jì)算就不用我給代碼了吧。
包含頭文件 math.h
反3角函數(shù)有 acos(double),asin(double),atan(double),atan(double,double),
返回值 double 型,弧度值。轉(zhuǎn)角度要 *180.0/3.1416
例如:
#include stdio.h
#includestdlib.h
#includemath.h
int main()
{
double x=0.5;
printf("acos=%.2lf degrees\n",acos(x) * 180.0/3.1416);
printf("asin=%.2lf degrees\n",asin(x) * 180.0/3.1416);
printf("atan=%.2lf degrees\n",atan(x) * 180.0/3.1416);
printf("atan2=%.2lf degrees\n",atan2(1.0,2.0) * 180.0/3.1416);
return 0;
}
是的啊,我給你再舉個(gè)例子,以下兩行分別打印出tan(45)=1,atan(1)=45。
注意:要用double類型,不然會(huì)得到錯(cuò)誤的結(jié)果。
#include stdio.h
#include math.h
#define pi 3.1415926
void main()
{
printf("%f\n",tan(double(45)/double(180)*pi));
printf("%f\n",atan(1)*double(180)/pi);
}