我想找到一个用于计算1 / d的快速算法,其中d是double(虽然它可以转换为整数)什么是许多算法的最佳算法(SRT,goldschmidt,newton raphson,...)?我用c语言编写程序。
提前感谢。
答案 0 :(得分:5)
最快的计划是:double result = 1 / d
;
答案 1 :(得分:2)
CPU:已经使用了你所描述的根查找迭代算法来找到倒数1 / d。因此,您应该发现使用相同算法的软件实现很难击败它。
如果您有很少/已知的分母,那么尝试查找表。对于更慢的函数,例如trig函数,这是常用的方法。
否则:只计算1 / d。这将是你能做的最快的。如果你必须
,你可以做很多事情来加速算术答案 2 :(得分:1)
我是从某人那里问过的,我得到了答案:
那么,你不能在FPGA中添加硬件分频器吗?还是快速互惠支持?
无论如何,这取决于。它有快速乘法吗?如果不是,那么这是一个问题,那么你只能实现慢速方法。
如果你有快速乘法和IEEE浮点数,你可以使用我在上一篇文章中链接的奇怪技巧,并进行几个改进步骤。这真的只是Newton-Raphson划分,初始近似计算更简单(但是对于单精度浮点数仍然只需要3次改进,就像常规的初始近似一样)。快速互惠支持也是这样做的 - 给出一个快速的初始近似值(处理指数权利并从查找表中获取有效位,如果你得到12个有效位,那么你只需要一个精确步骤用于单精度,或者13个就足够了获得双精度的2个步骤)并且可选地具有帮助实现细化步骤的指令(如AMD的PFRCPIT1和PFRCPIT2),例如计算Y =(1-D * X)并计算X + X * Y. / p>
即使没有那些技巧,Newton-Raphson分区仍然不错,线性近似只需要4次精确的双精度浮点数,但它也需要一些烦人的指数调整才能首先进入正确的范围(在硬件中不会有一半令人讨厌)。
Goldschmidt部门在业绩方面与大致相当,但实施起来可能稍微复杂一些。它实际上是同样的交易 - 诡计与指数进入正确的范围,“2 - 某事”估计技巧(在Newton-Raphson分部重新排列,但它实际上是相同的事情),并进行细化步骤直到所有位都正确。它看起来有点不同。