资源简介

三角函数包括反三角函数的实现,基本思想是利用泰勒级数。鉴于反三角函数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 < n; 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


评论

共有 条评论