デジタルコンピューター内で分割はどのように発生しますか?そのアルゴリズムは何ですか?
私はグーグルで一生懸命検索しましたが、満足のいく結果を得ていません。サンプルの図とともに、除算アルゴリズムの非常に明確なアルゴリズム/フローチャートを提供してください。
デジタルコンピューター内で分割はどのように発生しますか?そのアルゴリズムは何ですか?
私はグーグルで一生懸命検索しましたが、満足のいく結果を得ていません。サンプルの図とともに、除算アルゴリズムの非常に明確なアルゴリズム/フローチャートを提供してください。
回答:
デジタル設計の分割アルゴリズムは、主に2つのカテゴリに分類できます。遅い除算と速い除算。
これらの概念にまだ精通していない場合は、バイナリの加算と減算がどのように機能するかを読むことをお勧めします。
遅い部門
最も単純な低速メソッドはすべて次のように機能します。分子から分母を引きます。残りが分母より小さくなるまで、各減算の結果でこれを再帰的に行います。反復の量は整数の商であり、残りの量は余りです。
例:
7/3:
したがって、答えは2で、残りは1です。この答えをもう少し関連性のあるものにするために、いくつかの背景を示します。負の加算によるバイナリ減算は、たとえば次のように実行されます:7-3 = 7 +(-3)これは、その2の補数を使用して実現されます。各2進数は、一連の全加算器を使用して追加されます。
各1ビット全加算器は、次のように実装されます。
高速部門
除算の遅い方法は理解しやすい一方で、反復を繰り返す必要があります。さまざまな「高速」アルゴリズムが存在しますが、それらはすべて推定に依存しています。
ゴールドシュミット法を考えてみましょう:
このメソッドは次のように機能します。
この方法では、反復加算によるバイナリ乗算が使用されます。これは、最新のAMD CPUでも使用されています。
浮動小数点除算用のハードウェアは、乗算も行う論理ユニットの一部です。乗算器ハードウェアモジュールが利用可能です。浮動小数点数、たとえばAとBは、次のように分割(A / Bを形成)します。
仮数(数値の2進数)は、1/2〜1の固定小数点2進数です。つまり、2進小数点の後の最初の数字は「1」で、その後にゼロと1が続きます...最初のステップとして、ルックアップテーブルは6ビットまでの逆数を正確に検出します(32個の可能性があり、小さなテーブルです)
興味深いことに、古いPentiumの分割バグ(1994年に非常にニュース価値が高い)は、ステップ(4)の誤った相互テーブル値を作成した印刷エラーが原因でした。初期の論文「並列マルチプルイヤーを使用した除算方法」、Domenico Ferrari、IEEE Trans。電子。計算。EC-16 / 224-228(1967)は、「IBM System / 360モデル91:浮動小数点実行ユニット」IBM J. Res。開発者 11:34-53(1967)。
処理する数値に応じて、除算には非常に異なる方法があります。整数の場合、他の人が指定したシフトと減算の方法はうまく機能します。ただし、浮動小数点数の場合は、最初に分母の逆数を計算してから、その倍数を分子に掛けた方が速い場合があります。
分母の逆数の計算はそれほど悪くありません。逐次近似を精緻化することにより行われます。gを1 / dの推測値とします。推測を改善するには、g '= g(2-gd)を使用します。これは二次関数的に収束するので、改善ごとに精度を2倍にします。
例:3.5の逆数を計算します。
最初の推測は0.3です。0.3 * 3.5 = 1.15を計算します。調整後の推測は0.3 *(2-1.15)= 0.285です。すでにかなり近い!このプロセスを繰り返して、0.2857125を取得し、3回目の試行で0.2857142857を取得します。
いくつかのショートカットがあります。浮動小数点では、マシンの基数に応じて、10の累乗または2の累乗を抽出できます。また、メモリの使用量を増やすことで速度を上げるために、1〜bの範囲の数値(bは数値ベース)の事前計算済みテーブルを使用して、必要な逆数にすぐに近い推測を取得できます。 1つまたは2つの改良手順を保存します。
乗算とコルモゴロフの1960年の彼の学生アナトリーカラツバによる恥ずかしさのように、より速い方法またはより良い方法がいつ見つかるかは決してわかりません。好奇心を捨てないでください。
コンピューターは、数値を乗算するために反復加算を行いません-本当に遅いでしょう。代わりに、いくつかの高速乗算アルゴリズムがあります。チェックアウト:http : //en.wikipedia.org/wiki/Karatsuba_algorithm