ckv*_*ckv 22 computer-science mathematical-optimization
计算机如何对2个数字进行乘法运算,比如100*55.
我的猜测是计算机重复添加以实现乘法.当然,这可能是整数的情况.但是对于浮点数,必须有一些其他逻辑.
注意:这在面试中被问到了.
Dav*_*kes 28
重复添加将是一种非常低效的乘法数字方式,想象一下将1298654825乘以85324154.使用二进制使用长乘法要快得多.
1100100
0110111
=======
0000000
-1100100
--1100100
---0000000
----1100100
-----1100100
------1100100
==============
1010101111100
Run Code Online (Sandbox Code Playgroud)
对于浮点数,使用科学记数法.
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)
Run Code Online (Sandbox Code Playgroud)
将它们相乘可以乘以尾数并添加指数
= 1 * 5.5 * 10^(2+1)
= 5.5 * 1000
= 5500
Run Code Online (Sandbox Code Playgroud)
计算机使用二进制等价物来完成此操作
100 = 1.1001 * 2^6
55 = 1.10111* 2^5
-> 1.1001 * 1.10111 * 2^(6+5)
Run Code Online (Sandbox Code Playgroud)
Jac*_*ack 13
通常使用的方法被称为像人类一样的部分产品,所以例如100*55
让它做类似的事情
100 X
55
----
500 +
500
----
Run Code Online (Sandbox Code Playgroud)
基本上旧方法使用移位和累加算法,其中您保留总和,同时为第二个数字的每个数字移动部分乘积.这种方法的唯一问题是数字存储在2补码中,因此在shifing时你不能做每位乘法的普通位.
现在,大多数优化都能够在一个周期内对所有部分进行求和,从而使您可以更快地进行计算并更容易并行化.
看看这里:http://en.wikipedia.org/wiki/Binary_multiplier
最后你可以找到一些类似的实现
一种方法是使用二进制的长乘法:
01100100 <- 100
* 00110111 <- 55
----------
01100100
01100100
01100100
01100100
01100100
---------------
1010101111100 <- 5500
Run Code Online (Sandbox Code Playgroud)
这有时称为shift和add方法.
好的,这是你去的.我写了一段时间(1987年!),所以有些事情发生了变化,而其他事情则保持不变......
http://moneybender.com/transactor_article.pdf