【问题标题】:Newton's Method for finding the reciprocal of a floating point number for division牛顿法求浮点数的倒数进行除法
【发布时间】:2012-02-09 23:20:56
【问题描述】:

我正在尝试将两个数字相除,一个分子 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,那么我应该没问题。但这是标准做法吗?

【问题讨论】:

    标签: algorithm


    【解决方案1】:
    1. 要正确设置符号位,请对原始被除数和除数的符号执行异或。

    2. 现在使除数和被除数的符号为正数。

    3. 首先将被除数指数设置为等于divide_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,你的结果应该是正确的。

    更新:此算法工作正常。

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2021-10-28
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 2016-12-19
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多