代码之家  ›  专栏  ›  技术社区  ›  ckv

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

  •  21
  • ckv  · 技术社区  · 14 年前

    计算机是如何对两个数字(100*55)进行乘法的。

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

    9 回复  |  直到 14 年前
        1
  •  35
  •   Community Johnny    7 年前

    重复加法是一种非常低效的乘法方法,想象一下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)
    
        2
  •  14
  •   Jack    14 年前

    部分产品 100*55 它会像

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

    基本上旧的方法使用了一个移位累加算法,在这个算法中,保持第二个数的每一位的和,同时移动部分积。这种方法的唯一问题是,数字存储在2补码中,因此在移位时不能进行简单的逐位乘法。

    现在大多数优化都能在一个周期内完成所有部分的求和,这使得计算速度更快,并行化也更容易。

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

    最后,您可以找到一些实现,如

        3
  •  6
  •   Steven Evers    14 年前

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

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

    shift and add 方法。

        4
  •  5
  •   Don Branson marios    14 年前

    好的,给你。我不久前(1987年)写过这个,所以有些东西变了,而有些却保持不变。。。

    http://moneybender.com/transactor_article.pdf

        5
  •  3
  •   vpit3833    14 年前

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

        6
  •  2
  •   JeremyP    14 年前

    要将两个浮点数相乘,请使用以下步骤:

    1. 加上指数
    2. 标准化结果(小数点位于第一个非零位之后)

    以10为基数乘以5.1E3和2.6E-2

    将尾数相乘=>5.1*2.6=13.26(注意,这可以通过整数乘法来实现,只要您跟踪小数点应该在哪里)

    添加指数=>3 + -2 = 1

    标准化13.26E1=>1.326E2段

        7
  •  1
  •   Matt Mitchell    14 年前
        8
  •  1
  •   augustss    14 年前

    答案是,视情况而定。正如其他人所指出的,你可以使用和我们在学校教的相同的算法,但是用二进制代替。但对于少数人来说,还有其他方法。

    或者,你可以用一个大的门网络直接计算函数。然而,这些门网络对于大数的乘法往往变得相当笨拙。

        9
  •  1
  •   NguyenDat    14 年前

    我只编写了一个简单的程序,用长乘法算法将存储在文件中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