30

コンピューターは、100 * 55 などの 2 つの数値の乗算をどのように実行しますか。

私の推測では、コンピューターは掛け算を達成するために足し算を繰り返していたのです。もちろん、これは整数の場合にも当てはまります。ただし、浮動小数点数の場合は、他のロジックが必要です。

注:これはインタビューで尋ねられました。

4

9 に答える 9

37

1298654825 を 85324154 で乗算することを想像してみてください。

1100100
0110111
=======
0000000
-1100100
--1100100
---0000000
----1100100
-----1100100
------1100100
==============
1010101111100

浮動小数点数には科学表記法が使用されます。

100 is 1 * 10^2 (10 to the power of 2 = 100)
55 is 5.5 * 10^1 (10 to the power of 1 = 10)

それらを掛け合わせるには、仮数を掛けて指数を加算します

= 1 * 5.5 * 10^(2+1)
= 5.5 * 1000
= 5500

コンピュータは、同等のバイナリを使用してこれを行います

100 = 1.1001 * 2^6
55  = 1.10111* 2^5
-> 1.1001 * 1.10111 * 2^(6+5)
于 2010-06-17T08:36:07.533 に答える
14

通常使われている方法は人間と同じように部分積と呼ばれるものなので、例えば100*55こんな感じにすると

  100 X
   55
 ----
  500 +
 500
 ----

基本的に古いアプローチでは、2 番目の数値の各桁の部分積をシフトしながら合計を保持する、シフト累積アルゴリズムが使用されていました。このアプローチの唯一の問題は、数値が 2 の補数で格納されるため、シフト中に単純なビットごとの乗算を実行できないことです。

現在、ほとんどの最適化では、わずか 1 サイクルですべてのパーシャルを合計できるため、計算が高速になり、並列化が容易になります。

こちらをご覧ください: http://en.wikipedia.org/wiki/Binary_multiplier

最後に、次のようないくつかの実装を見つけることができます

于 2010-06-17T08:41:20.547 に答える
6

1 つの方法は、2 進数で長い乗算を使用することです。

       01100100 <- 100
     * 00110111 <- 55
     ----------
       01100100
      01100100
     01100100
   01100100
  01100100
---------------
  1010101111100 <- 5500

これは、 shift および addメソッドと呼ばれることもあります。

于 2010-06-17T08:44:28.327 に答える
5

よし、どうぞ。私がこれを書いたのは少し前 (1987 年!) なので、変更されたものもあれば、同じままのものもあります...

http://moneybender.com/transactor_article.pdf

于 2010-06-21T17:23:05.053 に答える
3

コンピュータは、算術演算にシフトと加算を行うブースのアルゴリズムまたはその他のアルゴリズムを使用します。コンピュータ アーキテクチャのコースを学習したことがある場合は、これらのアルゴリズムを学習するには、コンピュータ アーキテクチャに関する書籍が適しています。

于 2010-06-17T09:19:13.893 に答える
2

2 つの浮動小数点数を乗算するには、次の手順を使用します。

  1. 仮数を掛ける
  2. 指数を追加する
  3. 結果を正規化します (小数点はゼロ以外の最初の数字の後に来ます)

したがって、基数 10 で 5.1E3 と 2.6E-2 を乗算するには

仮数を掛ける => 5.1 * 2.6 = 13.26 (小数点の位置を追跡する限り、これは整数の乗算で実行できます)

指数を加算 => 3 + -2 = 1

13.26E1 という結果が得られます

正規化 13.26E1 => 1.326E2

于 2010-06-17T09:58:49.207 に答える
1

シフトも使用することで、直感的に追加の繰り返しを最小限に抑えることができます。

フロートに関しては、この記事はかなり関連性があります。

http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-1.html#HEADING1-19

于 2010-06-17T08:39:52.910 に答える
1

答えは、場合によります。他の人が指摘しているように、学校で教えられたのと同じアルゴリズムを使用できますが、代わりにバイナリを使用できます。しかし、少数の場合は別の方法があります。
2 つの 8 ビット数を乗算したいとします。これは、大きなルックアップ テーブルを使用して行うことができます。2 つの 8 ビット数値を連結して 16 ビット数値を形成し、その数値を使用してすべての製品を含むテーブルにインデックスを付けるだけです。
または、直接的な方法で関数を計算するゲートの大きなネットワークを持つこともできます。ただし、これらのゲート ネットワークは、大きな数の乗算には非常に扱いにくくなる傾向があります。

于 2010-06-17T09:58:27.413 に答える
1

アルゴリズムの長い乗算を使用して、ファイルの2行に格納された2つの数値を乗算する単純なプログラムをコーディングするだけです。互いに10億以上の数を持つ2つの数を乗算することができます

例:

            23958233
            5830 ×
         ------------
            00000000  ( =      23,958,233 ×     0)
           71874699   ( =      23,958,233 ×    30)
          191665864   ( =      23,958,233 ×   800)
         119791165    ( =      23,958,233 × 5,000)

ソースコード:

http://code.google.com/p/juniormultiply/source/browse/#svn/trunk/srcを確認してコメントをお寄せ ください

于 2010-07-17T13:58:23.933 に答える