分裂在我们的计算机中如何发生?


17

数字计算机内部如何进行除法运算?它的算法是什么?

我在Google上进行了艰苦的搜索,但没有得到满意的结果。请提供一个非常清晰的除法算法/流程图,并附上示例图。


1
@ program-o-steve ALU中的除法是一个复杂的操作。您不会得到“简单”的流程图。
Majenko

5
@莱昂·海勒哦!并不是说,这是一个纯粹的硬件问题
program-o-steve

2
@ Leon Heller我想不是……,其中包括电子,物理计算……
program-steve

2
微控制器的划分不是直接的。有快速的方法和缓慢的方法。慢速方式更容易理解,但是现代CPU中使用了快速方式,您特别想了解什么?您只是想对原理进行基本了解还是对现代CPU进行详细分析?
Konsalik 2011年

4
@LeonHeller我通常同意您要结束的问题,但是CPU设计在很大程度上是电气工程问题。这个问题可能会使用一些帮助,以使其更加清楚所要的内容(例如konsalik所要询问的内容),但这并不能使其脱离主题。
Kellenjb

Answers:


17

数字设计中的除法算法可以分为两个主要类别。慢速分割和快速分割。

如果您还不熟悉这些概念,建议您阅读有关二进制加法和减法如何工作的文章。

慢师

最简单的慢速方法都可以通过以下方式工作:从分子中减去分母。用每次减法的结果递归执行此操作,直到余数小于分母。迭代次数是整数商,剩余的次数是余数。

例:

7/3:

  1. 73=4
  2. 43=1
  3. 1<3

因此,答案为2,余数为1。为使该答案更有意义,这里有一些背景知识。通过加负数进行二进制减法,例如:7-3 = 7 +(-3)。这是通过使用其二进制补码来完成的。每个二进制数使用一系列完整的加法器相加:

在此处输入图片说明

每个1位全加器的实现方式如下:

在此处输入图片说明

快速分区

虽然较慢的除法很容易理解,但它需要重复迭代。存在各种“快速”算法,但是它们都依赖于估计。

考虑Goldschmidt方法:

Q=ND

此方法的工作方式如下:

  1. 将N和D与分数F乘以D接近1。
  2. 当D接近1时,N接近Q

此方法通过迭代加法使用二进制乘法,这在现代AMD CPU中也使用。


1
Atmel的AVR200应用笔记中给出了一些有关“慢速”方法变化的流程图(在微机上实现,没有硬件划分,但仍然有帮助)。
凯文·维米尔

您能举例说明戈德施密特的除法吗?另外,此处给出流程图是慢速除法的示例?
program-o-steve

我们必须反复将股息向左转移的方法是什么?
program-o-steve

@ program-o-steve这是一个快速说明:找到22/7(pi近似值)。首先,将顶部和底部乘以0.1得到:2.2 / 0.7,再乘以1.3,得出:2.86 / 0.91使用1.09,得出:3.1174 / 0.9919 1.008得到:3.1423393 / 0.9998352继续,您很快就会到达最终答案3.1428571 / 1.000000 ...
艾伦·坎贝尔

您如何“乘以分数”?分数在浮点数中无法表示。从定义上讲,分数是分子除以分母,因此您仍然需要循环除法。以及首先如何估计该比例?
CogitoErgoCogitoSum

4

浮点除法的硬件是逻辑单元的一部分,该逻辑单元也进行乘法运算。有一个乘法器硬件模块。浮点数(例如A和B)除以(形成A / B)

  1. 将浮点数分解为符号(+1或-1),尾数(“ a”和“ b”)以及(二进制整数类型)指数
  2. 如果两个符号相同,则结果的符号为(+1),否则为(-1)
  3. 减去指数(从A的指数减去B的指数)以形成结果的指数
  4. 尾数(数字的二进制数字)是介于1/2和1之间的定点二进制数字;这意味着二进制点之后的第一个数字为“ 1”,然后是零和一...作为第一步,查找表会找到精确到六位的倒数(只有32种可能性,这是一个小表)

  5. ab=areciprocal(b)breciprocal(b)

  6. d==1+ϵ
    d(2d)=(1+ϵ)×(1ϵ)=1ϵ2
  7. 现在分母正好为1的分子就是结果的尾数,可以与先前计算的符号和指数组合。
  8. IEEE浮点允许某些异常(非正规数,NAN;这些异常必须由其他逻辑运算处理)。

有趣的是,旧的Pentium除法错误(1994年非常有新闻价值)是由打印错误引起的,该错误导致步骤(4)的倒数表值出错。早期的论文“使用并行乘法器的除法”,Domenico Ferrari,IEEE Trans。电子。计算 EC-16 / 224-228(1967)描述了该方法,“ IBM System / 360 Model 91:浮点执行单元” IBM J. Res。开发人员 11:34-53(1967)。


1

根据要处理的数字,有非常不同的划分方法。对于整数,其他人给出的移位和减法会很好用。但是,对于浮点数,首先计算分母的倒数,然后将其乘以分子可能会更快。

分母的倒数的计算还不错。这是通过细化逐次逼近来完成的。令g为您对1 / d的猜测。为了提高猜测的准确性,请使用g'= g(2-gd)。这是二次收敛的,因此每次改进时,您的精度都将翻倍。

示例:计算3.5的倒数。

您最初的猜测是0.3。您计算出0.3 * 3.5 = 1.15。您的调整后猜测为0.3 *(2-1.15)= 0.285。已经很近了!重复该过程,您将获得0.2857125,而第三次尝试将获得0.2857142857。

有一些捷径。在浮点中,您可以提取10的幂或2的幂,具体取决于计算机的数量基础。并且,为了提高速度而以更大的内存使用为代价,您可以使用预先计算的表来计算范围在1到b之间的数字(其中b是您的数字基数),以得出与所需倒数立即接近的猜测。节省一到两个优化步骤。

请记住,就像乘法和Kolmogorov在1960年让他的学生Anatoly Karatsuba感到尴尬一样,您永远都不知道何时会找到更快或更更好的方法。永远不要屈服于好奇心。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.