牛顿找到除法的浮点数的倒数的方法

时间:2012-02-09 23:20:57

标签: algorithm

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

可以找到Newton-Raphson算法here

因此算法的第一步是从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,那我应该没问题。但这是标准做法吗?

1 个答案:

答案 0 :(得分:4)

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

  2. 现在制作除数和红利的标志。

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

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

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

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

  7. 乘以Xn * N = 1 / D * N = N / D,结果应正确。

  8. 更新:此算法正常运行。