• ベストアンサー

CORDICアルゴリズム

こんにちわ、sohです 三角関数をビットシフト演算と加減算のみで求められるという噂をききつけ CORDICアルゴリズムを調べてたんですが いまいちよくわからないんです(T^T やっぱり複素数平面をちゃんと勉強しなおさないと理解不能?(^^; 誰か簡単に説明していただけないでしょうか? とりあえずマイクロな(浮動小数点無しで非力なCPU&きつきつなメモリ)環境にて θ もしくは radianからsinθ(or radian)の値を有効小数点桁2桁くらいまでで、高速に求められば目的は達成できるのですが・・・・

質問者が選んだベストアンサー

  • ベストアンサー
noname#11476
noname#11476
回答No.2

昔なつかしのアセンブラーで色々遊んだことを思い出しました。 固定小数点でインラインアセンブル使ってずいぶん高速処理させましたねぇ。 では、理論はおいておいて、簡単に。 まず、テーブルを用意します。 double delta, x; /* make table */ delta = 1.0; for (i = 0; i < 10; i++) {  tbl[i] = atan(delta);  delta = delta / 2.0; }; 計算は、いま与える角度をa[radian]とすると、 int i; double x, tmp, y, z, d, s; x = 0.607252935; y = 0.0; z = a; d = 1.0; for (i = 0; i < 10; i++) {  if ( z > 0.0 ) s = -1.0; else s = 1.0;  tmp = x + s * d * y;  y = y - s * d * x;  x = tmp;  z = z + s * tbl[i];  d = d / 2.0; }; これで、xにはcosの値、yにはsinの値です。 n = 10位で2桁位の精度は出るでしょう。 あとは、上記を見ればわかるとおり、乗算部分はビットシフトで計算できますから、固定小数点にするなり、ぎりぎりまで繰り返し回数を減らすなりしてください。 あ、ちなみに計算する角度の範囲は0~90degreeにしておきます(つまり第1象限)。 それ以外はx, yから計算できますよね。 では。

-soh-
質問者

お礼

回答ありがとうございます。 あぁ、なーるほど ソースがあるとどういうシーケンスで動くのかわかりますわ(笑 まじでサンクスです。 始めのテーブルは回転角度を入れとくためのテーブルで 目標とする角度の近似になるよう収束させるんですね。 +-のぶれを if ( z > 0.0 ) s = -1.0; else s = 1.0; で修正しつつ収束させると。 テーブル作成部分も一応ビットシフトで高速化ができるかな、ってあれ・・・・? テーブル作成時に arctan使わんといかんのですか。 ん~っと。。。 そうか収束させるための回転角度の計算してるんですよねこのテーブル。 むむむ~~~、atanも持ってないから仕方ない データ数12個くらいのテーブルなら作っても大してメモリ圧迫しないで済むからつくっちゃうしかないのかなぁ? >あとは、上記を見ればわかるとおり、乗算部分はビットシフトで計算できますから ごめんなさい、ここがわからない tmp = x + s * d * y;  y = y - s * d * x; を tmp = x + ((s * y) >> d);  y = y - ((s * x) >> d); d ++; にできるのはわかったんですけど、他にビットシフトで対応できる個所ってどこなんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#11476
noname#11476
回答No.3

>テーブル作成時に arctan使わんといかんのですか。 そうなんですよ。でもこのテーブルは与える角度には関係なく一定だから数個くらいなのテーブルで持つしかないですね。 (要求精度にもよるけどsohさんの場合なら10個程度だから) このテーブルは1/2^(n-1)で小さくなるからそんなに沢山必要ないですよね。 あとは、 if ( z > 0.0 ) s = -1.0; else s = 1.0; tmp = x + s * d * y; y = y - s * d * x; 上記の式で、sは結局 +1 or -1 だから上のifに入れ込むと sub,addどちらかを使うようにすれば s* はいらないですよね。 d はお気づきのようにシフト演算ですね。 x = tmp; z = z + s * tbl[i]; ここの掛け算も +1, -1 だから ifの中に入れてしまえば掛け算はいらない。 d = d / 2.0; これはシフト演算に吸収されると。 となると結局 s* は add か sub に分岐すればよくてなくなるし、 d* はシフト命令になってひとつも乗算はなくなるわけですね。 z の符号はMSBのbit見てあげればよいだけだから簡単だし。 では~。

-soh-
質問者

お礼

な~るほど、Zの符号も確かに第一bitで判定できますね 気が付かなかった! うぅ~ん、奥が深いなぁ 度重なる質問にも丁寧にお答えいただきありがとうございましたm(__)m

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

読んだ人は「一体何のこっちゃ」と思いますでしょう。私も全然判らないものですが、引っかかっチャッた。 下記のページを読ませて頂いて、何をおしゃっているのか判りました。 ● http://www.inh.co.jp/~inasaims/cordic/cordic.html 引用「つまり、 1, 1/2, 1/4, 1/8, 1/16, ...... この部分の計算が、ビットシフトだけで実現できるのがCORDICのミソです。 つまり、計算自体が、x’=x+1/(2^n)y、のように ビットシフトと加算だけで非常に簡単にできるようになっています.」 ●昔アッセンブラを使っていた時、ビット演算を良く使いましたが 、レジスター等で1ビットシフト左シフトは2倍に、(回転式でない内)右シフトは1/2になりますよね。シフト回路は組みやすい。加算回路も基本的で、2種類の回路ロジックで済めば、組みこみ回路に重用される気がします。 ●上記ページに出てきた恒等変換の回転式に対比された、 回転マトリックスのgの[1 -pD、pD 1]、D=1/2^(n-1) の意味が(なぜSINの値を出せるのに使えるのか)判れば良いのでしょうね。疑問掲載分野としては、数学系の方が適当では?あとは専門家さまよろしく。

-soh-
質問者

お礼

回答ありがとうございまする うん、わしもそのページは見つけて いみわから~ん って感じだったんですよ(^^; 数学とどっちにしようかも悩んだんですが 1970年代に一世を風靡したアルゴリズムらしいのでプログラミング関係にしとこっかなぁ・・ って。 そんな考えだったんですけど、やっぱり数学にしとけばよかったかしら。。。。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Accessクエリの整数型と単精度型の演算について

    Accessのクエリで長整数型と単精度浮動小数点型を 加算すると答えが一致しません。理由を知っている人いますか? ちなみに長整数型と倍精度浮動小数点型を加算したときは答えが一致します。 浮動小数点は誤差がつきものなのは分かりますが、 確か単精度浮動小数点型は有効桁数7桁までのはず。 下記の例では問題ないように見えます。 (例)長整数型と単精度浮動小数型の演算:1000+0.20=1000.20000000298 長整数型と倍精度浮動小数型の演算:1000+0.20=1000.2 それではよろしくお願いします。

  • 浮動小数点演算と固定小数点演算の使い分けについて

    解説書などには、「浮動小数点は3.14E0の形」や「固定小数点は3.14」などと説明されています。 では、例えば、ごく一般的な32ビットマシンで「3.14 * 45.6」という命令を書いたときに演算されるのは浮動小数点演算なのか、固定小数点演算なのかがわかりません。例えばIntelのx86CPUは、内部にFPUを持っているそうですが、この場合は「3.14 * 45.6」は、内部では必ず浮動小数点演算になっているということなのでしょうか? 「3.14 * 45.6」を「3.14E0 * 4.56E1」と書いた場合にしか浮動小数点演算されないということではないと思っているのですが、実際の浮動小数点演算と固定小数点演算の内部的な切り替えがわかりません。 理解が足りなくて、おかしな質問になっていましたら、その点もご指摘いただければうれしいです。

  • AthronX2 5200とCore2DuoE6600で浮動小数点の演算が速いのはどっち?

    AthronX2 5200とCore2DuoE6600で浮動小数点の演算が速いのはどちらなのでしょうか?ベンチマークでいろいろ異なる結果が出て困っています。HD BENCHではCore2DuoE6600がAthronx2 4200に負けてしまいました。CUBASE(DAW)を使用しているので浮動小数点演算が速くないと困るのです。本当にAthronX2 5200とCore2DuoE6600で浮動小数点の演算が速いのはどちらなのでしょうか?Core2DUOの浮動小数点演算の能力が低ければ買い替えを検討しています。多角的な側面からアドバイス願います。

  • 量子化

    量子化についてご教示下さい。 例えばある浮動小数点表示を考えましょう。ただしその表示方法で表すことができる、絶対値が最も小さい値をaとします。この浮動小数点表示で0で表される場合を0に置換し、0より大きい値で表される場合をT(>>a)、負の値で表される場合を-Tに置換するとします。 この演算を量子化と記してよいでしょうか?

  • 低消費電力版CPUのクロック当たり処理能力低い理由

    たとえば下記の3つのCPUです。 i3-3220T 最高クロック2.80GHz 浮動小数点演算性能 44.80 GFLOPS i5-3210M 最高クロック3.10GHz 浮動小数点演算性能 40.00 GFLOPS i7-3517U 最高クロック3.00GHz 浮動小数点演算性能 30.40 GFLOPS http://hardware-navi.com/cpu.php 最高クロックはほぼ同じですが、どうして最大演算性能にはこんなに違いがあるのでしょうか。 低消費電力版CPUがクロック当たり処理能力が低くなる理由を具体的に説明お願いします。

  • 浮動小数点演算とは

    浮動小数点演算とは何か調べたのですがイマイチよくわかりません。 簡単に言うとどういうことでしょうか?

  • iアプリで浮動小数点を使いたい

    iアプリで確立を計算したいのですが、浮動小数点が使えないので困っています。 整数演算で浮動小数点を扱うクラスを自作するしかないのでしょうか? 使えそうなクラスなど、ご存知でしたら教えてください。

    • ベストアンサー
    • Java
  • 浮動小数点演算FLOPSについて

    コンピュータの勉強はじめたのですが 浮動小数点演算とは どのようなことをさすのでしょうか。

  • 浮動小数点数を10進表記するアルゴリズム

    与えられた浮動小数点数から正確な10進表記の文字列を得るにはどうすればよいでしょうか。 主に、2進の指数を10進の指数に直す部分で悩んでいます。 単純に考えれば、2進数字の各桁について10進表記の数字列を求めて10進演算する方法が思いつきますが、大きな数や小さな数では計算量が極端に増えてしまいます。もっと効率的な方法はないものでしょうか。 logを取ればうまいこと計算量を減らせそうな気もしますが、正確さが犠牲になりそうです。

  • 安価に、高速な浮動小数点演算をするためのハードウェアについて

    安価に、高速な浮動小数点演算をするためには、どんなハードウェアがあるでしょうか、またはこれらの情報をまとめているサイトなどがありましたら、教えていただけないでしょうか。 具体的には、現在入手できる浮動小数点演算の得意なICの一覧などが得られるとうれしいです。 現在のところ、計算対象を限っていませんが、最終的な目標として行列計算などが高速に出来たらと考えています。

このQ&Aのポイント
  • 在庫管理において、販売できない破損品や品質不良品を製品在庫から引き落とし、簿外品とする方法について教えてください。会計のルール上、問題はないのでしょうか?
  • 破損品は評価損として計上できるだけでなく、簿外品とすることも可能です。在庫管理において簿外にすることに問題はありませんが、会計のルールや事例に基づいて行ってください。
  • 在庫管理で販売できない破損品や品質不良品を簿外にする方法について調査しました。会計のルール上、問題はないとされており、簿外にすることができます。根拠となる会計のルールや事例も確認してください。
回答を見る