これは、加減算,bitshiftとLUT(Look Up Table)(定数表)のみの計算で 三角関数(sin,cos),逆三角関数(arcsin,arccos),双曲線関数(sinh,cosh),逆双曲線関数(arcsinh,arcosh)などを求めることができる。
数3(複素数)を理解していれば、アイデアは割とすぐに理解できるだろう。
まず前提として、2進数において
行列を用いた解説
があるが、複素数のほうが本質が理解しやすいように思うので、今回は複素数を用いた説明を試みる。
絶対値
この表記を用いて、求めるものを表してみる。
ここで
となる。この式がアルゴリズムの本質である。
となるが、よく見ると
とすると分解の結果から、
これは2進数の各桁の値が
①事前に計算して表に格納しておく:
②入力
③加減算とビットシフトの繰り返しで複素数の乗算を行い、逐次
③は特に、複素平面上では点
分解の一般論と正当性は
「N進数の一般化について」
を参照してほしい。分解方法を工夫して10進CORDICについて考える。
さて、Minecraftで計算機を制作するにあたり、10進数計算のほうが信号強度の配線上のメリットや変換コスト、伝搬コストが少ないので、CORDICを10進数に改良する必要がある。
しかし安直に
としても、分解を行うことが不可能である(各桁に入る数字が2パターンしか無く、不足する)
今度は冗長10進数で次のように表そうとしてみる
今度は誤差
が使えなくなる。
そこで条件を少し緩める。
は
次のように
正当性,誤差評価については
「N進数展開の一般化と分解について」
で既に説明している。
LUTに格納しておくのは
さらに線形近似を用いて必要なテーブル数を減らす。
として
有効桁数をNとして
これにより
となる。
となる。今回はラジアンではなくデグリーでの実装を試みたので、実際には
実は複素数を用いると双曲線CORDICもセットで理解できる。
ここで注意しなければならないのは、三角関数の場合と違い、
を分解基底に取ると
なので分解が完全でない点である。
命題:基底の完全性
を参照。そこで、途中でkをダブらせて2回同じ分解を行うなどする必要がある。その意味で
たとえば
などとすれば完全である(greedyな算法)