dポイントプレゼントキャンペーン実施中!

下記のサイトのソースを元に
アークタンジェント( atan2()関数 )をテーブル化してみたのですが

http://asdf.wkeya.com/code/usetable_hpp.html

誤差が気になり何か良い補正の方法はないかと探して見たところ
なかなか見つかりませんでした
次のサイトでSinテーブルの誤差を修正する方法は見つけたのですが

http://ctrlwww.ee.noda.tus.ac.jp/wiki/kansai/ind …

そこでatanテーブルの誤差を補正する
なにかわかりやすくよい方法はないでしょうか?

A 回答 (4件)

No.3の訂正です。


>テイラー展開の最初の項はTacosanで書かれていますので、
テイラー展開の最初の項はNo2でTacosanさんが書かれていますので、
と書くべきところを、Tacosanさんすみません。

No.3の二次の項までを入れてざっと計算してみましたがCで倍精度ではatanの方が速かったです、No.2で書かれている一次までだとテーブルを使う方が若干速いという結果でした。
    • good
    • 0

No.1です


テイラー展開の最初の項はTacosanで書かれていますので、その次の項からは
http://mail2.nara-edu.ac.jp/~asait/c_program/sam …
が参考になると思います。
続きを書くと
atan a + x/(1+a^2)-x^2*a/(1+a^2)^2......
のようになります。
ここまで計算するとatanの方が速い可能性もありますので、単に速度を上げる目的なら注意してください。テーブル引きは意外と時間がかかりますので。
    • good
    • 0

「誤差が気になり」ってところは, 本当は「どのあたりの引数でどのくらいの誤差になっているのか, そして必要な精度はどうなっているのか」を知りたいんだけど....



テイラー展開すると
atan(x+a) = atan a + x/(1+a^2) + ...
かな. あるいは線形補間するとか.

この回答への補足

精度に関してなんですが
-45~45度を90分割~450分割した場合を考えています
使いまわせるように
精度を選択できるようにしておきたいなと思ったので

補足日時:2013/05/03 21:26
    • good
    • 0

テイラー展開を使うのが一番簡単なように思います。


質問欄の2番目のリンクは、sin(a+b)のsinの加法定理を使って、cos(b)とsin(b)を taylor展開できれいに展開できていますが、atanの場合は適当な加法定理がなさそうなので、強引にテイラー展開するのが簡単そうです。

x=a+bとおいて(aはテーブルにある角度、bはその近傍)
atan(a+b)-atan(a)をそれぞれ展開し、
その結果をテーブルから求めたatan(a)に足すとそこそこの精度が得られます。
この場合はaの項が残りますのでリンクのような美しさはないですが。

SSEのようなベクトル計算機能のないCPUだと多分速度が得られるように思いますが、最近のCPUだとテーブルを使わない方法と比べてみるのもおもしろいと思います。

この回答への補足

x=a+bで
aはatan2(y,x)の引数y/xで引けるテーブルの値なのはわかるのですが
bはどうやって求めれば良いのでしょうか?
2つ目のURLの
gosa=x-sinindex*M_PI/254
のあたりから取れば良いのでしょうか?

補足日時:2013/05/03 20:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!