sin/cos を Taylor 展開して fit
http://d.hatena.ne.jp/shinichiro_h/20040828#p1
の続き。まだ途中ですけど急速にやる気が減ってきたのでとりあえず精度に関する調査をやったところまで。
とりあえずこれが結果生成物まとめ。
http://shinh.skr.jp/koneta/approxmath.tgz
ヘッダだけ。
http://shinh.skr.jp/tmp/approxmath.h
approxmath.h が今回作った数式群の実装です。 sin1, sin2, ... とか cos1, cos2, ... とかの終わりの数字は、それぞれ sin, cos の計算次数を示しています。その後に _p2, _p4, _2p4 が付くのですが、これは pi/2, pi/4, 2*pi/4 をあらわし、それぞれプラスマイナス pi/2, pi/4, pi/2 の範囲で有効な近似になっています。 _2p4 は _p4 を用いて倍角の公式を用いて計算しています。
テストコードは calcerr.c として入ってますが、その結果はこんな感じ。
http://shinh.skr.jp/tmp/approxmath_result.txt
(W) は有効範囲の外を調べていることを示します。あと taylor というのはオリジナルの Taylor展開です。やはり fit した方がいくらか良くなっています。 taylor sininf というのは収束まで Taylor 展開しています。標準数学関数との誤差を知ることができます。
現実的に使うとすると、たぶん倍角の公式が必要になってくるのですけど、 sin の方の倍角公式は sin と cos が両方でてきて少し計算量がおいしくない気がします。なんとかできるといいけど今一つ一般的でおいしい方法が無いなあ…と。
今のところ float でしかやってませんし、速度も調べてません。なんていうかこういうのはどうせあまり一般的に通用するものを書こうと思うとすごい大変なので、とりあえず展開して fit した数式だけ紹介できれば、後は各人で調整する方が良いのかなぁ…とか思ったのでやる気がなくなりました。
ちなみに私的には 3次-4次程度のもので十分な気がします。
あとsin-x先生の記述を見て解析入門でざっと追っかけてみるも素晴しさがなんとなくしかわからず。修行が足りません。