CORDICとsin/cos

1
とみながたけひろ @takehiro_t

x86 FPUでsincosが何故同時に計算できるのか分からなかったcordicを学ぶ前の俺。学んだ頃にはx86なんて完全に忘れていたがその後数年たって二つの知識が頭の中で融合した^^;;

2011-05-03 01:19:12
AoiMoe a.k.aしお兄P @AoiMoe

CORDICとか懐かしいアクロニムをTLで見た。sqrtとかsinとかcosみたいな関数を、代数的に直接計算する変な手法

2011-05-03 01:24:58
AoiMoe a.k.aしお兄P @AoiMoe

収束があんまり速くない(というか1ループ回すたびに1ビット厳密に計算される)ので、最近はあんまり使われないけれど、単純な整数の四則演算しか持ってないようなハードで固定小数点で計算するには便利

2011-05-03 01:27:08
AoiMoe a.k.aしお兄P @AoiMoe

x86アセンブラでCORDIC使ってsinとcosを固定小数点で計算するルーチンは書いたことがある

2011-05-03 01:29:27
とみながたけひろ @takehiro_t

などというおっさん発言を、実家に並ぶ二台のX68kを前にして感慨深く思い出すのであった。なお俺が始めてコの業界でお金を稼いだのはFLOAT2!(分かる人はオッサンorオバサン確定)

2011-05-03 01:29:37
AoiMoe a.k.aしお兄P @AoiMoe

うん、もうどんなアルゴリズムだったかはすっぱりと忘れたので、詳しくはぐぐってくれたまへ

2011-05-03 01:30:10
AoiMoe a.k.aしお兄P @AoiMoe

あれの面白さは、任意のビット数のsinやcosの値を、代数的手法の繰り返しだけで厳密に計算できるという変な美しさだな。

2011-05-03 01:32:40
AoiMoe a.k.aしお兄P @AoiMoe

マクローリン展開あたりだと、確かsin/cosあたりは一項増やすだけで有効数字が倍になったりするので、CORDICの一項あたり1bitってのは、やっぱり遅い。

2011-05-03 01:36:58
AoiMoe a.k.aしお兄P @AoiMoe

というようなことを大学時代に調べて、詳細はすっぱり忘れた俺です

2011-05-03 01:41:05
AoiMoe a.k.aしお兄P @AoiMoe

でも、「sin/cosはマクローリン展開すると1項ごとに倍になるよ」みたいなどーでもいいことだけ覚えてれば、あとはいくらでも調べられるわけ。……しかしながら、この例に関して言えば、もっと大事な格言を思い出した:「sin/cosは自前で書くな」

2011-05-03 01:43:44
とみながたけひろ @takehiro_t

いま日本語ページ対象にCORDICでグーグル検索したら俺のページが二番目か。何年前のページやねん…

2011-05-03 01:45:06
AoiMoe a.k.aしお兄P @AoiMoe

CORDICとかDDA/bresenhamアルゴリズムあたりは、純粋なプログラミングの楽しさが味わえる題材だと思う

2011-05-03 01:50:40
AoiMoe a.k.aしお兄P @AoiMoe

CORDICにはほとんど実用的価値がないけれど、DDAは今でもそれなりに使い道がある

2011-05-03 01:51:04
AoiMoe a.k.aしお兄P @AoiMoe

CORDICは確かに(オーダー的な意味で)遅いんだけど、たとえば16bit固定小数点演算だったらマクローリン展開より速かったりするわけです。そういう世界もあるんだな。

2011-05-03 07:59:32