資源簡介
三角函數包括反三角函數的實現,基本思想是利用泰勒級數。鑒于反三角函數ACOS在0.9-1的時候利用直接利用泰勒級數時收斂很慢的缺點,比較ulicx作了優化,使得精度和時間都達到了自己預期。適用于在嵌入式環境下不好實用math庫的項目

代碼片段和文件信息
//?CalDis.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“stdio.h“?
#include?“stdlib.h“??
#include?“time.h“
#include?“math.h“
#define?PI????????3.14159265358979323846
#define?COEFF???6370693.4856530580439461631130889
//角度轉弧度
double?deg2rad(double?deg)
{
????return?(deg*PI)/180.0;
}
double?rad2deg(double?rad)
{
????return?rad*180/PI;
}
double?fabs(double?x)
{
if?(x?0)
return?-x;
return?x;
}
//牛頓迭代法求開方
double?k_sqrt(double?adouble?x0)
{?
double?x1y;
x1=(x0+a/x0)/2.0;??
if(fabs(x1-x0)>=10e-15)
y?=?k_sqrt(ax1);
else??y=x1;
??return?y;
}
double?sqrt(double?x)
{?
return?k_sqrt(x?1.0);
}
//用于計算距離和方向
double?sin(double?x)
{
???double?result=xtemp=x;
???double?den=xfac=1;
???int?n=1sign=1;
???while((temp>1e-15)||(temp<-1e-15))????????
???{
???????n++fac*=nden*=x;
???????n++fac*=nden*=x;
???????temp=den/fac;sign=-sign;
???????result=sign>0?result+temp:result-temp;
???}
???return?result;
}?
double?cos(double?x)
{
x=PI?/?2?-?x;
return?sin(x);
}???
double?pow(double?x?int?n)
{
double?result?=?1;
if?(n?==?0)
return?1;
for?(int?i?=?0;?i? {
result*=x;
}
return?result;
}
long?factorial(int?x)
{
long?result?=?1;
for?(int?i?=?1;?i?<=?x;?i++)
result?*=?i;
return?result;
}
double?asin(double?x)
{
double?result=0;
double?temp=x;
int?n=1;
while((temp>1e-15)||(temp<-1e-15))????????
{
result?+=?temp;
temp?=?factorial(2*n)?/?(pow(2?2*n)?*?pow(factorial(n)?2))?*?pow(x?2*n+1)?/?(2*n+1);
printf(“%lf?%d\n“?temp?n);
n++;
}
printf(“n=%d\n“n);
return result;
}
double?acos(double?x)
{
if?(fabs(x)?0.5)
return?PI?/?2?-?asin(x);
else
return?2?*?asin(sqrt((1-x)/2));
}
//計算距離
double?distance(double?lat1double?lon1double?lat2double?lon2)
{
????double?test=sin(deg2rad(lat1))?*?sin(deg2rad(lat2))?+?cos(deg2rad(lat1))?*?cos(deg2rad(lat2))?*?cos(deg2rad(lon1?-?lon2));
printf(“test?%.lf\n“?test);
????return?COEFF*acos(test);
}?
int?main(int?argc?char*?argv[])
{
clock_t?start?finish;??
double??duration;??
start?=?clock();
printf(“%lf\n“?sin(deg2rad(0)));
printf(“%lf\n“?cos(deg2rad(60)));
?
printf(“%.15lf\n“?cos(acos(0.99999988888887)));
printf(“%lf\n“?cos(acos(0.5)));
?
????printf(“%lf\n“?distance(31.589204?118.46524231.589804?118.465242));
printf(“%lf\n“sqrt(2));
finish?=?clock();??
??
duration?=?(double)(finish?-?start)?/?CLOCKS_PER_SEC;??
??
printf(?“%f?seconds\n“?duration);??
????
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2624??2014-06-29?23:35??CalDis\CalDis.cpp
?????文件???????4544??2014-06-29?23:20??CalDis\CalDis.dsp
?????文件????????518??2014-06-24?14:40??CalDis\CalDis.dsw
?????文件??????50688??2014-06-29?23:38??CalDis\CalDis.opt
?????文件???????1273??2014-06-29?23:35??CalDis\CalDis.plg
?????文件?????192580??2014-06-29?23:35??CalDis\Debug\CalDis.exe
?????文件?????228984??2014-06-29?23:35??CalDis\Debug\CalDis.ilk
?????文件??????13361??2014-06-29?23:35??CalDis\Debug\CalDis.obj
?????文件?????203608??2014-06-25?16:52??CalDis\Debug\CalDis.pch
?????文件?????459776??2014-06-29?23:35??CalDis\Debug\CalDis.pdb
?????文件???????1827??2014-06-25?16:52??CalDis\Debug\StdAfx.obj
?????文件??????41984??2014-06-29?23:35??CalDis\Debug\vc60.idb
?????文件??????53248??2014-06-29?23:35??CalDis\Debug\vc60.pdb
?????文件???????1208??2014-06-24?14:40??CalDis\ReadMe.txt
?????文件????????293??2014-06-24?14:40??CalDis\StdAfx.cpp
?????文件????????769??2014-06-24?14:40??CalDis\StdAfx.h
?????目錄??????????0??2014-06-29?23:35??CalDis\Debug
?????目錄??????????0??2014-06-29?23:38??CalDis
?????文件??????50176??2014-06-29?23:38??CalDis\CalDis.ncb
-----------?---------??----------?-----??----
??????????????1307461????????????????????19
- 上一篇:后臺檢測關鍵字,觸發執行操作源碼,AU3源碼。
- 下一篇:新建文本文檔(1).txt
評論
共有 條評論