Mathematics & Programme

返回主页<-

三角函数的高精度计算
 
基本的式子:
 

sinx =x-x3/3!+x5/5!-...(-1)k-1*x2k-1/(2k-1)!+...      (0<x<∞)

cosx =1-x2/2!+x4/4!-...(-1)k*x2k/(2k)!+...           (0<x<∞)

arcsinx =x + 1/2*x3/3 + 1*3/(2*4)*x5/5 + ...       (|x|<1)

arctanhx = x + x^3/3 + x^5/5 + ...                   (x≤1)

 

tanx =sinx/√1-sin2x

arccosx = π-arcsinx

 

一般法:

 

计算sin和cos, tan时把角度化小(用诱导公式)后直接用公式算都不太慢.

也可以用 三角函数 提到的半角公式递归地把角度化小再用上述幂级数计算.

 

反三角函数的计算可以归结为 arctan 的计算. 用下式把 x 化小, 然后用上述幂级数计算.

 

没有经过实践的(二分法):
sin()    { 示意性源码 sin.c sin.pas }

 

对于 sin(1/x)=P(0,n)/Q(0,n)  n→∞

设 

   R(a,b)=(2a+2)(2a+3)...(2b+1),  Q(a,b)=R(a,b)x2(b-a)

   P(a,b)=(-1)aQ(a,b)+(-1)a+1Q(a+1,b)+...(-1)b-1Q(b-1,b)+(-1)b

递归算{ m=[(a+b)/2], P(a,b)=P(a,m)Q(m,b)+P(m+1,b), Q(a,b)=Q(a,m)Q(m,b) }

 其中 R(a,a+1)=(2a+2)(2a+3)    Q(a,a+1)=(2a+2)(2a+3)x2

      P(a,a+1)=(-1)a(2a+2)(2a+3)x2+(-1)a+1

 

或对于 sin(1/x)=(1+P(0,n)/Q(0,n))/x  n→∞

   R(a,b)=(2a+2)(2a+3)...(2b+1),  Q(a,b)=R(a,b)x2(b-a)

   P(a,b)=(-1)a+1Q(a+1,b)+(-1)a+2Q(a+2,b)+...+(-1)b-1Q(b-1,b)+(-1)b

递归算{ m=[(a+b)/2], P(a,b)=P(a,m)Q(m,b)+P(m,b), Q(a,b)=Q(a,m)Q(m,b) }

 其中 R(a,a+1)=(2a+2)(2a+3)    Q(a,a+1)=(2a+2)(2a+3)x2

      P(a,a+1)=(-1)a+1

cos()    { 示意性源码 cos.c cos.pas }

 

对于 cos(1/x)=1+P(0,n)/Q(0,n) 

   R(a,b)=(2a+1)(2a+2)...2b, Q(a,b)=R(a,b)x2(b-a)

   P(a,b)=(-1)a+1Q(a+1,b)+(-1)a+2Q(a+2,b)+...+(-1)b-1Q(b-1,b)+(-1)b

递归算{ P(a,b)=P(a,m)Q(m,b)+P(m,b), Q(a,b)=Q(a,m)Q(m,b) }

arctan()    { 示意性源码 tan.c tan.pas }
  对于  arctan(1/x)=(1+P(0,n)/Q(a,b))/x

设:

  R(a,b)=(2a+3)(2a+5)...(2b+1), Q(a,b)=(2a+3)(2a+5)...(2b+1)q2(b-a)

递归算

P(a,b) = Q(m,b)P(a,m)+R(a,m)P(m,b),    Q(a,b) = Q(a,m)Q(m,b),   R(a,b) = R(a,m)R(m,b).

所谓 没有经过实践 的意思是没有试过用此方法进行高精度计算, 但其正确性是可以保证的.

Last update 9/02/2007

 

交流:  留言本 or xyy82148@163.com