计算机如何对2个数字进行乘法运算,比如100 * 55。
我的猜测是计算机重复添加以实现乘法。当然,这可能是整数的情况。但是对于浮点数,必须有其他逻辑。
注意:这是在采访中被问到的。
答案 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年!),所以有些事情发生了变化,而其他事情保持不变......
答案 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)
要将两个浮点数相乘,使用以下过程:
因此,在基数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