计算机如何将2个数字相乘?

时间:2010-06-17 08:32:01

标签: computer-science mathematical-optimization

计算机如何对2个数字进行乘法运算,比如100 * 55。

我的猜测是计算机重复添加以实现乘法。当然,这可能是整数的情况。但是对于浮点数,必须有其他逻辑。

注意:这是在采访中被问到的。

9 个答案:

答案 0 :(得分:27)

重复添加将是一种非常低效的乘法数字方式,想象一下将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)

将它们相乘,将mantissas相乘并添加指数

= 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)

答案 1 :(得分:13)

通常使用的方法与人类一样称为部分产品,因此例如100*55它会像

那样做
  100 X
   55
 ----
  500 +
 500
 ----

基本上,旧方法使用移位和累加算法,在该算法中,您可以保留总和,同时为第二个数字的每个数字移动部分乘积。这种方法的唯一问题是数字存储在2补码中,因此在移位时不能进行每位乘法运算。

现在大多数优化都能够在一个周期内对所有部分进行求和,从而使您可以更快地进行计算并更容易并行化。

看看这里:http://en.wikipedia.org/wiki/Binary_multiplier

最后你可以找到一些像

这样的实现

答案 2 :(得分:5)

一种方法是使用二进制长乘法:

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

这有时称为shift and add方法。

答案 3 :(得分:5)

好的,你走了。我写了一段时间(1987年!),所以有些事情发生了变化,而其他事情保持不变......

http://moneybender.com/transactor_article.pdf

答案 4 :(得分:3)

计算机使用Booth的算法或其他算法来进行算术运算的移位和添加。如果您学过计算机体系结构课程,那么计算机体系结构的书籍应该是研究这些算法的好地方。

答案 5 :(得分:1)

直观地说,您也可以通过使用移位来最小化重复添加。

就浮动数而言,本文看起来非常相关:

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

答案 6 :(得分:1)

答案是,这取决于。正如其他人所指出的,你可以使用我们在学校教授的相同算法,但是使用二进制代替。但对于小数字,还有其他方法 假设您想要将两个8位数相乘,这可以使用大型查找表来完成。您只需将两个8位数字连接起来形成一个16位数字,然后使用该nunber索引到包含所有产品的表格中。
或者,你可以拥有一个大门网络,直接计算功能。虽然这些门网络对于大数字的乘法而言往往变得非常笨重。

答案 7 :(得分:1)

要将两个浮点数相乘,使用以下过程:

  1. 乘以mantissas
  2. 添加指数
  3. 归一化结果(小数点在第一个非零数字之后)
  4. 因此,在基数10中乘以5.1E3和2.6E-2

    乘以mantissas =&gt; 5.1 * 2.6 = 13.26(注意这可以通过整数乘法来完成,只要你跟踪小数点应该在哪里)

    添加exponents =&gt; 3 + -2 = 1

    给我们13.26E1的结果

    标准化13.26E1 =&gt; 1.326E2

答案 8 :(得分:1)

我只是编写一个简单的程序,使用算法长乘法将存储在2行中的两个数相乘。它可以乘以两个数字彼此超过10亿的数字

示例:

            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