计算机如何对 2 个数字进行乘法运算,例如 100 * 55。
我的猜测是计算机通过重复加法来实现乘法。当然,这可能是整数的情况。但是对于浮点数必须有一些其他的逻辑。
注意:这是在采访中提出的。
计算机如何对 2 个数字进行乘法运算,例如 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-complement 中,因此您不能在移位时进行简单的 bit per bit 乘法。
如今,大多数优化都能够在 1 个周期内对所有部分求和,从而使您能够进行更快的计算和更轻松的并行化。
看看这里:http ://en.wikipedia.org/wiki/Binary_multiplier
最后,您可以找到一些实现,例如
一种方法是使用二进制长乘法:
01100100 <- 100
* 00110111 <- 55
----------
01100100
01100100
01100100
01100100
01100100
---------------
1010101111100 <- 5500
这有时称为shift 和 add方法。
好吧,就这样吧。我在不久前写了这篇文章(1987 年!),所以有些事情发生了变化,而其他事情保持不变......
计算机使用布斯算法或其他算法来进行算术运算的移位和加法。如果你学过计算机架构课程,那么计算机架构方面的书籍应该是学习这些算法的好地方。
要将两个浮点数相乘,请使用以下过程:
所以,以 10 为底乘以 5.1E3 和 2.6E-2
将尾数相乘 => 5.1 * 2.6 = 13.26(注意,只要跟踪小数点的位置,就可以通过整数乘法来完成)
添加指数 => 3 + -2 = 1
给我们一个 13.26E1 的结果
标准化 13.26E1 => 1.326E2
直观地,您可以通过使用移位来最小化重复添加。
就浮动而言,这篇文章看起来非常相关:
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-1.html#HEADING1-19
答案是,这取决于。正如其他人指出的那样,您可以使用我们在学校教过的相同算法,但使用二进制代替。但对于少数人,还有其他方法。
假设您想将两个 8 位数字相乘,这可以通过一个大查找表来完成。您只需将两个 8 位数字连接起来形成一个 16 位数字,然后使用该数字索引到包含所有产品的表中。
或者,您可以拥有一个直接计算函数的大型门网络。但是,这些门网络对于大数的乘法往往变得相当笨拙。
我只是编写了一个简单的程序,使用算法长乘法将存储在文件中 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