アルゴリズムとデータ構造連載の3日目です。
除算・平方根の計算のためのハードウェアアルゴリズム
CPUには除算や平方根といった比較的複雑な計算が必要な演算を行うハードウェアが実装されています。除算は、筆算に対応するような単純な方法で計算すると、ビット数nとしてO(n)の計算ステップ(≒CPUサイクル数)がかかります。
しかしながら、50年以上前から、これらをより高速に計算するアルゴリズムが開発され、ハードウェア上で実装されています。
教科書にも載るくらい代表的なものとしてニュートン・ラフソン法(以下、ニュートン法)を利用するものがあります。本ページではこれを解説してみます。
ニュートン法による除算計算アルゴリズム
ニュートン法により除算の計算結果の近似値を反復的に求め続けることで、計算結果に必要なだけの精度で除算結果が得られます。
ニュートン法とは
ニュートン法は数値計算のアルゴリズムの一種で、実数値関数 f に関して
https://ja.wikipedia.org/wiki/ニュートン法
初期値を
グラフで幾何的に考えると、
図で表現すると以下です。
計算結果の誤差
一般的に、ニュートン法による近似値と真値との誤差は、前計算ステップの誤差の二分の一になること(二次収束すること)を示すことができます。
すなわち、誤差は計算ステップに対して指数的に減少(!)し、数値の二進展開における正しい桁数の長さが、計算ステップごとに倍になっていきます。
よくある
除算への適用
除数
このとき漸化式は
となります。
ビット数
平方根への計算
開平対象の値を
このとき漸化式は
となります。
参考: 開平を計算するコード(Ruby)
実装例として入力に
require 'bigdecimal' |
まとめ
- CPUの演算器の実装としてハードウェアアルゴリズムがはるか昔から研究されている
- ニュートン法による除算や開平のアルゴリズムが有名
- ニュートン法は二次収束するため計算ステップに対して指数的に誤差が減少する