算法中浮点除法的步骤是什么?
为什么结果比说,乘法慢?
它是否像我们手工分割那样完成?通过重复除以除数,减去结果以获得余数,再次对齐数字并继续直到余数小于特定值?
另外,为什么我们获得了性能,而不是做
a = b / c
我们的确是
d = 1 / c a = b * d
?
编辑:基本上我问的是因为有人要求我根据权重的分配在竞争者中分配一个值.我用整数做了所有这些,后来被要求转换为浮动,这导致性能下降.我只是想知道C或C++如何做这些会导致缓慢的操作.
FPU部门通常基本上使用Newton-Raphson(或其他算法)来获得倒数然后乘以该倒数.这就是为什么倒数操作比一般除法操作略快的原因.
这篇HP论文(实际上比我遇到的关于Newton-Raphson的大多数论文更容易理解)有关于浮点除法的说法:
浮点除法和平方根比加法和乘法计算时间要长得多.后两者直接计算,而前者通常用迭代算法计算.最常见的方法是使用无除法的Newton-Raphson迭代来得到分母(除法)或倒数平方根的倒数的近似值,然后乘以分子(除法)或输入参数(平方根) .
从硬件的角度来看,除法是一种迭代算法,它所花费的时间与位数成正比.目前最快的分区使用radix4算法,每次迭代生成4位结果.对于32位除法,至少需要8步.
乘法可以在一定程度上并行完成.如果不详细说明,您可以将大量乘法分解为几个较小的独立乘法.这些乘法可以再次分解,直到你处于一个位级别,或者你提前停止并在硬件中使用一个小的查找表.这使得乘法硬件从硅片房地产的角度来看很重,但也非常快.这是经典的尺寸/速度权衡.
您需要log2步骤来组合并行计算结果,因此32位乘法需要5个逻辑步骤(如果您降低到最小值).幸运的是,这5个步骤比分割步骤更简单(它只是添加).这意味着在实践中倍数甚至更快.
如维基百科文章分区算法中所述,计算机中存在两种主要划分方法:
使用以下重复并在每次迭代中找到一个数字:
partialRemainder[j+1] = radix * partialRemainder[j] - quotientDigit[n-(j+1)]*denominator
从估计开始并收敛于商.您的准确程度取决于迭代次数.
Newton-Raphson部门(非常简短):
计算倒数的估计.
计算更准确的倒数估计.
通过将被除数乘以倒数来计算商.