✔ 最佳答案
一個幾好的答案,在這裏補充一些有關係資訊。
Taylor Series (泰勒數列) 的壞處有2.
1.) 計算較慢,它需要計算很多乘法,和
2.) 誤差較大,尤其是x 愈大誤差愈大。
現成最快的算法計算三角比的方法是CORDIC.
詳細的算法可在這裏找到。
http://www.cnmat.berkeley.edu/~norbert/cordic/node4.html
這個算法其實不難,想像一條長度是1的線一直在左轉右轉直到接近你想要的角度,只要任何時候都能計到 x - coordinate,就能算到sine的值。
怎轉呢,數學上,某點(x,y) 由圓心起轉 p 度就是 (x', y')
x' = x cos(p) - y sin(p) = cos(p) [ x - y tan(p) ]
y' = y cos(p) + x sin(p) = cos(p) [ y + x tan(p) ]
那麼只要記著一個表,其中有大有少的角度的tan和cos值,就可以慢慢接近它了.
如果我有tan(5)和tan(2),就可以轉到tan(2), tan(3), tan(4), tan(5), ....
網址裏2^i 和 K factor 之類的數只是用來優化算法,實際上對理解沒甚麼作用。
當然表裏最開始的數總是要計的, 這些可以使用taylor series做即使慢也沒關係的預計算。因為只需要計一次就永遠放在表裏。
由於sin, cos, tan 的數值有時會是超越數,它的值求遠也沒有算完的一天,我們只要算到足夠的精準度即可。
log 是一個完全不同的故事,計算log的話,上面的答案只能算x > 0 的時候的答案,如x 小於0,(i.e. log y, y < 1) 則必須用log(y) = -log(1/y) = -log(1 + p), p > 0 來算。同樣地,當x的數值是大的時候,誤差會很大。
最快的計log的方法是使用Arithmetic Geometric Mean 來計。
兩個數字的Arithmetic Geometric Mean 是這樣計的:
(A', B') = ((A + B)/2, sqrt(AB))
(A'', B'') = ((A' + B')/2, sqrt(A'B '))
不停咁計直到A' 非常接近 B'
log(x) = pi / 2 AGM(1,4/s) - m log 2.
where s = x2^m, pick big m.
這一份學術文章詳細解釋了原因,但很困難,我自己也沒全看懂。
http://cr.yp.to/arith/logagm-20030717.pdf
2007-05-16 22:56:09 補充:
其實我自己都未明晒,尤其係AGM方面的。