コンピューターで分割はどのように発生しますか?


17

デジタルコンピューター内で分割はどのように発生しますか?そのアルゴリズムは何ですか?

私はグーグルで一生懸命検索しましたが、満足のいく結果を得ていません。サンプルの図とともに、除算アルゴリズムの非常に明確なアルゴリズム/フローチャートを提供してください。


1
ALUの@ program-o-steve部門は複雑な操作です。「単純な」フローチャートは得られません。
マジェンコ

5
@レオンヘラーああ!だから、言っていません。これは、純粋なハードウェアの質問です
プログラム-O-スティーブ・

2
レオン・ヘラー@私はそれはないと思います....、エレクトロニクス、物理的なコンピューティング...含まれている
プログラム-O-スティーブ

2
マイクロコントローラの分割は簡単ではありません。速い方法と遅い方法があります。遅い方法は理解しやすいですが、現代のCPUでは速い方法が具体的に何を知りたいですか?原則の基本的な理解や、最新のCPUの詳細な分析が必要ですか?
コンサリック

4
@LeonHeller私はたいていあなたが閉じたい質問に同意しますが、CPU設計は電気工学の質問です。この質問は、(konsalikが尋ねているもののように)必要なものをより明確にするために何らかの助けを使用できますが、それはトピックから外れません。
ケレンイブ

回答:


17

デジタル設計の分割アルゴリズムは、主に2つのカテゴリに分類できます。遅い除算と速い除算。

これらの概念にまだ精通していない場合は、バイナリの加算と減算がどのように機能するかを読むことをお勧めします。

遅い部門

最も単純な低速メソッドはすべて次のように機能します。分子から分母を引きます。残りが分母より小さくなるまで、各減算の結果でこれを再帰的に行います。反復の量は整数の商であり、残りの量は余りです。

例:

7/3:

  1. 73=4
  2. 43=1
  3. 1<3

したがって、答えは2で、残りは1です。この答えをもう少し関連性のあるものにするために、いくつかの背景を示します。負の加算によるバイナリ減算は、たとえば次のように実行されます:7-3 = 7 +(-3)これは、その2の補数を使用して実現されます。各2進数は、一連の全加算器を使用して追加されます。

ここに画像の説明を入力してください

各1ビット全加算器は、次のように実装されます。

ここに画像の説明を入力してください

高速部門

除算の遅い方法は理解しやすい一方で、反復を繰り返す必要があります。さまざまな「高速」アルゴリズムが存在しますが、それらはすべて推定に依存しています。

ゴールドシュミット法を考えてみましょう:

Q=ND

このメソッドは次のように機能します。

  1. Dが1に近づくように、NとDを分数Fで乗算します。
  2. Dが1に近づくと、NがQに近づく

この方法では、反復加算によるバイナリ乗算が使用されます。これは、最新のAMD CPUでも使用されています。


1
AtmelのAVR200 appnote には、「遅い」方法(ハードウェアを分割せずにマイクロでのアセンブリで実装されますが、まだ有用です)のバリエーションのフローチャートがいくつか示されています。
ケビンフェルメール

ゴールドシュミットの分割方法の説明をお願いします。また、ここに示されているフローチャートは、ゆっくりとした除算の例ですか?
program-o-steve

配当を左に繰り返しシフトする方法は何ですか?
program-o-steve

@ program-o-steve簡単な説明を次に示します。22/ 7(pi近似)を見つけます。最初に、上下に0.1を乗算して取得します:2.2 / 0.7再度乗算し、1.3を使用して、2.86 / 0.91 1.09を使用して:3.1174 / 0.9919 1.008が3.1423393 / 0.9998352続行します、すぐに最終回答3.1428571 /に到達します1.000000 ...
アラン・キャンベル

どうやって「分数を掛ける」のですか?分数は浮動小数点では表現できません。定義による分数は、分子を分母で除算したものであるため、分割する必要があるという円形の引数が残っています。そして、そもそもその割合をどのように推定するのでしょうか?
-CogitoErgoCogitoSum

4

浮動小数点除算用のハードウェアは、乗算も行う論理ユニットの一部です。乗算器ハードウェアモジュールが利用可能です。浮動小数点数、たとえばAとBは、次のように分割(A / Bを形成)します。

  1. 浮動小数点数を符号(+1または-1)、仮数( "a"および "b"、および(2進整数型)指数に分解します。
  2. 結果の符号は、両方の符号が同じである場合は(+1)、そうでない場合は(-1)です。
  3. 指数が減算され(Bの指数がAの指数から減算されます)、結果の指数が形成されます
  4. 仮数(数値の2進数)は、1/2〜1の固定小数点2進数です。つまり、2進小数点の後の最初の数字は「1」で、その後にゼロと1が続きます...最初のステップとして、ルックアップテーブルは6ビットまでの逆数を正確に検出します(32個の可能性があり、小さなテーブルです)

  5. ab=arecprocalbbrecprocalb

  6. d==1+ϵ
    d2d=1+ϵ×1ϵ=1ϵ2
  7. 分子は、分母が正確に「1」であるため、結果の仮数であり、以前に計算された符号および指数と組み合わせることができます。
  8. IEEE浮動小数点では、いくつかの例外(非正規化数、NAN、他の論理演算で処理する必要があるもの)が許可されます。

興味深いことに、古いPentiumの分割バグ(1994年に非常にニュース価値が高い)は、ステップ(4)の誤った相互テーブル値を作成した印刷エラーが原因でした。初期の論文「並列マルチプルイヤーを使用した除算方法」、Domenico Ferrari、IEEE Trans。電子。計算。EC-16 / 224-228(1967)は、「IBM System / 360モデル91:浮動小数点実行ユニット」IBM J. Res。開発者 11:34-53(1967)。


1

処理する数値に応じて、除算には非常に異なる方法があります。整数の場合、他の人が指定したシフトと減算の方法はうまく機能します。ただし、浮動小数点数の場合は、最初に分母の逆数を計算してから、その倍数を分子に掛けた方が速い場合があります。

分母の逆数の計算はそれほど悪くありません。逐次近似を精緻化することにより行われます。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年の彼の学生アナトリーカラツバによる恥ずかしさのように、より速い方法またはより良い方法がいつ見つかるかは決してわかりません。好奇心を捨てないでください。


-1

コンピューターは、数値を乗算するために反復加算を行いません-本当に遅いでしょう。代わりに、いくつかの高速乗算アルゴリズムがあります。チェックアウト:http : //en.wikipedia.org/wiki/Karatsuba_algorithm


EE.SEへようこそ。リンクのみの回答は推奨されません。リンクの情報を要約してください。
ヌル14

彼らはします。大量のCPUにはまだシングルサイクルの乗算器がなく、ソフトウェアの複製を使用します。
user3528438
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.