关于算法:牛顿的方法,用于找到除法的浮点数的倒数

Newton's Method for finding the reciprocal of a floating point number for division

我试图将两个数字,一个分子N除以除数D.
我正在使用Newton-Raphson方法,该方法使用牛顿方法找到D(1 / D)的倒数。然后通过将分子N乘以倒数1 / D得到N / D,可以得到除法的结果。

Newton-Raphson算法可以在这里找到

所以算法的第一步是从1 / D的初始猜测开始,我们称之为X_0。

X_0定义为X_0 = 48 / 17-39 / 17 * D.

但是,我们必须首先对除数D应用位移以对其进行缩放,使0.5≤D≤1。应对分子N应用相同的位移,以使商不变。

然后我们使用公式X_(i + 1)= X_i *(2-D * X_i)找到X_(i + 1)

由于分子N,除数D和结果都是浮点IEEE-754 32位格式,我想知道如何正确应用这种缩放,因为我的1 / D值没有收敛到一个值,它只是接近 - Inf或+ Inf(取决于D)。

我发现的工作原理是,如果我使X_0小于1 / D,算法似乎总是收敛。因此,如果我只使用查找表,我总是存储一堆1 / D的值,我总能确保我有一个存储的1 / D值,其中D> Dmin,那么我应该没问题。但这是标准做法吗?


  • 要正确设置符号位,请在原始被除数和除数的符号上执行XOR。

  • 现在使除数和红利的标志为正。

  • 首先将被除数指数设为dividend_exponent- 1 - divisor_exponent - 1 + 127。
    +127是偏见,因为我们只是减去它。这会将股息按照我们将除数除以的相同数量进行扩展。

  • 将除数指数更改为126(有偏差)或-1(无偏)。这会将除数缩放到0.5到1之间。

  • 继续使用第一步中的新缩放D值查找Xo。 Xo = 48 / 17-32 / 17 * D.

  • 继续使用新的D找到Xn,直到我们迭代了足够的次数,以便我们获得所需的精度。 X(i + 1)= X(i)*(2-D * X(i))。此外,我们需要的步骤数S是S = ceil(log_2((P + 1)/ log_2(17)))。其中P是二进制位数

  • 乘以Xn * N = 1 / D * N = N / D,您的结果应该是正确的。

  • 更新:此算法正常工作。