コンピューターは、100 * 55 などの 2 つの数値の乗算をどのように実行しますか。
私の推測では、コンピューターは掛け算を達成するために足し算を繰り返していたのです。もちろん、これは整数の場合にも当てはまります。ただし、浮動小数点数の場合は、他のロジックが必要です。
注:これはインタビューで尋ねられました。
コンピューターは、100 * 55 などの 2 つの数値の乗算をどのように実行しますか。
私の推測では、コンピューターは掛け算を達成するために足し算を繰り返していたのです。もちろん、これは整数の場合にも当てはまります。ただし、浮動小数点数の場合は、他のロジックが必要です。
注:これはインタビューで尋ねられました。
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)
通常使われている方法は人間と同じように部分積と呼ばれるものなので、例えば100*55
こんな感じにすると
100 X
55
----
500 +
500
----
基本的に古いアプローチでは、2 番目の数値の各桁の部分積をシフトしながら合計を保持する、シフト累積アルゴリズムが使用されていました。このアプローチの唯一の問題は、数値が 2 の補数で格納されるため、シフト中に単純なビットごとの乗算を実行できないことです。
現在、ほとんどの最適化では、わずか 1 サイクルですべてのパーシャルを合計できるため、計算が高速になり、並列化が容易になります。
こちらをご覧ください: http://en.wikipedia.org/wiki/Binary_multiplier
最後に、次のようないくつかの実装を見つけることができます
1 つの方法は、2 進数で長い乗算を使用することです。
01100100 <- 100
* 00110111 <- 55
----------
01100100
01100100
01100100
01100100
01100100
---------------
1010101111100 <- 5500
これは、 shift および addメソッドと呼ばれることもあります。
よし、どうぞ。私がこれを書いたのは少し前 (1987 年!) なので、変更されたものもあれば、同じままのものもあります...
コンピュータは、算術演算にシフトと加算を行うブースのアルゴリズムまたはその他のアルゴリズムを使用します。コンピュータ アーキテクチャのコースを学習したことがある場合は、これらのアルゴリズムを学習するには、コンピュータ アーキテクチャに関する書籍が適しています。
2 つの浮動小数点数を乗算するには、次の手順を使用します。
したがって、基数 10 で 5.1E3 と 2.6E-2 を乗算するには
仮数を掛ける => 5.1 * 2.6 = 13.26 (小数点の位置を追跡する限り、これは整数の乗算で実行できます)
指数を加算 => 3 + -2 = 1
13.26E1 という結果が得られます
正規化 13.26E1 => 1.326E2
シフトも使用することで、直感的に追加の繰り返しを最小限に抑えることができます。
フロートに関しては、この記事はかなり関連性があります。
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-1.html#HEADING1-19
答えは、場合によります。他の人が指摘しているように、学校で教えられたのと同じアルゴリズムを使用できますが、代わりにバイナリを使用できます。しかし、少数の場合は別の方法があります。
2 つの 8 ビット数を乗算したいとします。これは、大きなルックアップ テーブルを使用して行うことができます。2 つの 8 ビット数値を連結して 16 ビット数値を形成し、その数値を使用してすべての製品を含むテーブルにインデックスを付けるだけです。
または、直接的な方法で関数を計算するゲートの大きなネットワークを持つこともできます。ただし、これらのゲート ネットワークは、大きな数の乗算には非常に扱いにくくなる傾向があります。
アルゴリズムの長い乗算を使用して、ファイルの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を確認してコメントをお寄せ ください