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

Computer science 计算机如何将两个数字相乘?,computer-science,mathematical-optimization,Computer Science,Mathematical Optimization,计算机如何对两个数字进行乘法,比如100*55 我的猜测是计算机通过重复加法来实现乘法。当然,整数也可能是这样。然而,对于浮点数,必须有其他一些逻辑 注:这是在一次采访中提出的。重复加法将是一种非常低效的数字乘法方法,想象一下将1298654825乘以85324154。只使用二进制的长乘法要快得多 1100100 0110111 ======= 0000000 -1100100 --1100100 ---0000000 ----1100100 -----1100100 ------1100100

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

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


注:这是在一次采访中提出的。

重复加法将是一种非常低效的数字乘法方法,想象一下将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-补码中,因此在移位时不能进行简单的逐位乘法

现在,大多数优化都能够在一个周期内求和所有部分,从而使计算速度更快,并行化更容易

请看这里:

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


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

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

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

答案是,视情况而定。正如其他人指出的,你可以使用和我们在学校教的相同的算法,但是使用二进制。但对于小数字,还有其他方法。
假设您想将两个8位数字相乘,这可以通过一个大的查找表来完成。您只需将两个8位数字连接起来,形成一个16位数字,并使用该数字将所有产品索引到一个表中。

或者,你可以有一个大的门网络,直接计算函数。但是,这些门网络对于大数乘法来说往往非常笨拙。

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

  • 乘以尾数
  • 添加指数
  • 使结果正常化(小数点位于第一个非零位之后)
  • 以10为基数乘以5.1E3和2.6E-2

    将尾数相乘=>5.1*2.6=13.26(注意,这可以通过整数相乘来实现,只要您跟踪小数点的位置)

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

    给我们一个13.26E1的结果


    正常化13.26E1=>1.326E2

    好的,给你。我不久前(1987!)写过这篇文章,所以有些事情已经改变了,而有些事情保持不变


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

    请回顾并给出您的评论

    当然不是,你的意思是,根据数字的长度或数值,将使用不同的算法。因此,在计算机的处理器中,没有一种方法或算法可以使用。根据数据选择不同的算法。如果我错了,请纠正我。即使这样,你仍然需要将100x5乘以两次,不是吗?在十进制中,你必须乘以100*5和10*5,但在二进制中,你必须乘以1或0,这意味着你可以加上它,也可以不加。很好的文章,非常有用请在你的回复中包含一篇文章的摘要,将来链接可能会中断。