sin
logのときと同様に最適な有理関数を[0, π/2]で求めよう。
ソースを少しいじるだけなので簡単に求まる。
n = 3とすると、
誤差は、
0 : error = 0.00665545
1 : error = 0.000283412
2 : error = 0.000102882
3 : error = 0.000156899
1e-5ほしいとするとまだ足りない。
n = 4とすると、
...
誤差は、
...
2 : error = 3.00438e-006
3 : error = 1.77347e-006
4 : error = 3.54258e-006
h4で誤差は十分。
なんのことはない、テーラー展開でよいのだ。
これでsinを書いてみた。
[-π/2, π/2]で使える。
double sin2(double x) {
double x2 = x * x;
return x * ((((1.0 / 362880 * x2 - 1.0 / 5040) * x2
+ 1.0 / 120) * x2 - 1.0 / 6) * x2 + 1);
}
これで、11ns。sinは48nsだった。