2008/03/07(金) [n年前の日記]
#1 [iappli] CORDICとやらで求めたatan2の結果を検証
C言語で書かれたCORDIC ―― 「double を使って求める版」「int のみで求める版」のソースに遭遇できたので、それらをJavaで書き直して実験したり。
得られた結果は Javaに標準で入ってる atan2() とさほど変わらないように見える。もっとも、ラジアンと角度の変換をしてる時点でもはや精度もへったくれもないやろという気もするのだけど。まあ、ゲームアプリに使える程度の精度があれば充分というか。
色々な方法で atan2() を動かしてみたのだけど、速度的には予想通り、テーブルをいきなり参照してしまう版が一番速い模様。テーブル参照版の処理時間を1とすると、CORDICで取得する版は、2.7倍。sin関数とcos関数を使って2分探索していく版は、27倍の時間がかかる。ただ、テーブル参照版は、テーブルのサイズも一番食うわけで…。
つまり、速度を優先するなら、
というか今時の言語・ライブラリは、atan2() を標準で持ってるものがほとんどだし、そっちのほうがえてして処理も速いわけで。自分でわざわざ用意する必要なんてないんだけど。どうして自分がこのへん調べてるかというと、昔の携帯上でatan2()を使おうとすると自分で用意するしかないから、なのであります。
携帯アプリのライブラリも、最近のライブラリなら3D関係をやる都合上、atan2() が入ってるし。機種を特定できれば、昔の機種でもオプションライブラリに atan2() があったりするんで。あくまで、昔の機種、かつ、色んな機種でも動かせるようなアプリを作るなら、という話でございますれば。
得られた結果は Javaに標準で入ってる atan2() とさほど変わらないように見える。もっとも、ラジアンと角度の変換をしてる時点でもはや精度もへったくれもないやろという気もするのだけど。まあ、ゲームアプリに使える程度の精度があれば充分というか。
色々な方法で atan2() を動かしてみたのだけど、速度的には予想通り、テーブルをいきなり参照してしまう版が一番速い模様。テーブル参照版の処理時間を1とすると、CORDICで取得する版は、2.7倍。sin関数とcos関数を使って2分探索していく版は、27倍の時間がかかる。ただ、テーブル参照版は、テーブルのサイズも一番食うわけで…。
つまり、速度を優先するなら、
- テーブル参照版。
- CORDIC版。
- 2分探索版。
- 2分探索版。
- CORDIC版。
- テーブル参照版。
- CORDIC版。
- 2分探索版。
- テーブル参照版。
というか今時の言語・ライブラリは、atan2() を標準で持ってるものがほとんどだし、そっちのほうがえてして処理も速いわけで。自分でわざわざ用意する必要なんてないんだけど。どうして自分がこのへん調べてるかというと、昔の携帯上でatan2()を使おうとすると自分で用意するしかないから、なのであります。
携帯アプリのライブラリも、最近のライブラリなら3D関係をやる都合上、atan2() が入ってるし。機種を特定できれば、昔の機種でもオプションライブラリに atan2() があったりするんで。あくまで、昔の機種、かつ、色んな機種でも動かせるようなアプリを作るなら、という話でございますれば。
◎ 参考ページ。 :
◎ CORDICって流行らないのかな。 :
日本語で書かれた解説ページがほとんど見当たらないのだけど。しかし「どうやらCORDICという方法があるらしいぞ」という文言はちょくちょく見かける。なんだか都市伝説の域に入っちゃってるんじゃないのかという感がなきにしもあらず。いや、ハードウェア関係ではかなり使われてるらしいのだけど。
[ ツッコむ ]
以上です。