我想知道在实现32位IEEE-754浮点除法时有什么权衡:使用LUT而不是Newton-Raphson方法?
当我说权衡时,我的意思是在内存大小,指令数等方面
我有一个小内存(130个字(每个16位))。我将尾部的12位高位(包括隐藏位)存储在一个存储位置,将低位12位的尾数存储在另一个位置。
目前我正在使用newton-raphson分部,但我正在考虑如果我改变了我的方法有什么权衡。以下是我的算法的链接:Newton's Method for finding the reciprocal of a floating point number for division
谢谢你,请解释你的推理。
答案 0 :(得分:4)
权衡取舍相当简单。 LUT使用额外的内存,希望减少指令数量,足以节省一些时间。它是否有效将在很大程度上取决于处理器的细节 - 特别是缓存。
对于Newton-Raphson,您将X / Y更改为X *(1 / Y)并使用迭代查找1 / Y.至少根据我的经验,如果你需要完全精确,它很少有用 - 它的主要优点是允许你更快地找到(比如说)16位精度的东西。
通常的划分方法是bit-by-bit method。虽然这个特定的答案处理整数,但对于浮点数你基本上都是相同的,除了它与你一起减去指数。浮点数基本上是A * 2 N ,其中A是有效数,N是数的指数部分。因此,你取两个数A * 2 N / B * 2 M ,并进行除法为A / B * 2 NM ,在这种情况下,A和B被视为(基本上)整数。唯一真正的区别是,对于浮点,您通常需要舍入而不是截断结果。这基本上只意味着执行除法(至少)一个额外的精度,然后如果额外的位是一个那么四舍五入。
使用查找表的最常用方法是SRT划分。这通常是在硬件中完成的,所以我可能谷歌就像“Verilog SRT”或“VHDL SRT”这样的东西。用C ++渲染它应该不是非常困难。我在链接的答案中概述的方法在每次迭代的位上产生,这可以写成2,4,等等。如果存储器服务,表的大小与每次迭代产生的位数呈二次方增长,所以你很少在实践中看到超过4个。
答案 1 :(得分:3)
每个Newton-Raphson步骤大约是精度数字的两倍,所以如果你能计算出你想要的特定尺寸LUT的精度位数,你应该能够计算出多少个NR步骤你需要达到你想要的精度。 Cray-1使用NR作为其倒数计算的最后阶段。为了解决这个问题,我在第9届IEEE计算机算术研讨会(1989年9月6日至8日)上发现了一篇相当详细的文章:An Accurate, High Speed Implementation of Division by Reciprocal Approximation。