|
返回主页<- |
| 三角函数的高精度计算 |
| |
| 基本的式子: |
| |
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 |
|