関数の速度(5)

前回求めた有理関数を展開すると、

 h_0(x) = \frac{1}{1+\frac{1}{2}x-\frac{1}{12}x^2+\frac{1}{24}x^3-\frac{19}{720}x^4} = 1 + \cdots + \frac{1}{5}x^4 - \frac{71}{480}x^5 + \cdots
 h_1(x) = \frac{1+\frac{19}{30}x}{1+\frac{17}{15}x+\frac{7}{30}x^2-\frac{1}{90}x^3} = 1 + \cdots + \frac{1}{5}x^4 - \frac{899}{5400}x^5 + \cdots
 h_2(x) = \frac{1+\frac{7}{10}x+\frac{1}{30}x^2}{1+\frac{6}{5}x+\frac{3}{10}x^2} = 1 + \cdots + \frac{1}{5}x^4 - \frac{33}{200}x^5 + \cdots
 h_3(x) = \frac{1+\frac{3}{10}x-\frac{1}{15}x^2+\frac{1}{60}x^3}{1+\frac{4}{5}x} = 1 + \cdots + \frac{1}{5}x^4 - \frac{4}{25}x^5 + \cdots
 h_4(x) = 1-\frac{1}{2}x+\frac{1}{3}x^2-\frac{1}{4}x^3+\frac{1}{5}x^4

h1とh2が近そうだが、実際に[1,2]で最大誤差を見てみると、

0 : error = 0.00520393
1 : error = 0.000249046
2 : error = 0.000186153
3 : error = 0.00129726
4 : error = 0.0901862

と、h2がわずかによい。

n = 5だと、

0 : error = 0.00382214
1 : error = 0.000101333
2 : error = 2.54874e-005
3 : error = 5.77497e-005
4 : error = 0.000722938
5 : error = 0.0764805

と、

 h_2(x) = \frac{1+x+\frac{11}{60}x^2}{1+\frac{3}{2}x+\frac{3}{5}x^2+\frac{1}{20}x^3}

が最もよくなって、連分数と変わらなかった。

atan

同様にatanについても求めよう。
精度はCGに使うのに、[0,1]でたぶん1e-4程度あれば十分だと思うが、1e-5としておく。
そうすると、n=6が必要で、

 \frac{x(15015+19250x^2+5943x^4+256x^6)}{15015+24255x^2+11025x^4+1225x^6}

となって、最大誤差が5.56331e-6となった。
ベンチマークすると、atanの約87nsが約15nsと単に割り算するのとあまり変わらない数値となった。