• ベストアンサー

CORDICアルゴリズム

noname#11476の回答

  • ベストアンサー
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 ++; にできるのはわかったんですけど、他にビットシフトで対応できる個所ってどこなんでしょうか?

関連する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の一覧などが得られるとうれしいです。 現在のところ、計算対象を限っていませんが、最終的な目標として行列計算などが高速に出来たらと考えています。