首页 文章

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

提问于
浏览
4

我试图将两个数字,一个分子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 回答

  • 4
    • 要正确设置符号位,请在原始被除数和除数的符号上执行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,结果应正确 .

    更新:此算法正常工作 .

相关问题