2012-02-09 167 views
4

我想用除數D除分子N的兩個數字。 我使用牛頓 - 拉夫遜方法,它使用牛頓法找到D(1/D)。然後分子的結果可以通過分子N乘以倒數1/D得到N/D。Newton's找到除法的浮點數的倒數的方法

牛頓 - 拉夫遜算法可以找到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 + 1)= X_I *(2-d * X_I)

由於兩個分子N,除數d,和結果都浮點IEEE-754 32位格式,我想知道如何正確應用這種縮放,因爲我的1/D值不收斂到一個值,它只是接近-Inf或+ Inf(取決於D)。

我發現的作品雖然是,如果我使X_0小於1/D,算法似乎總是收斂。所以,如果我只是使用查找表,我總是存儲一堆1/D的值,並且我可以始終確保在D> Dmin時存儲1/D值,那麼我應該沒問題。但那是標準做法嗎?

回答

4
  1. 要正確設置符號位,請對原始除數和除數的符號執行異或運算。

  2. 現在就制定除數和紅利的標誌。

  3. 首先設置股利指數等於dividend_exponent- 1 - divisor_exponent - 1 + 127. +127是偏差,因爲我們剛剛減去它。這將按照我們將通過縮放除數的相同數量來調整股息。

  4. 將除數指數改爲126(有偏)或-1(無偏)。這將除數縮放到0.5和1之間。

  5. 繼續從步驟1中找到具有新的縮放D值的Xo。 Xo = 48/17-32/17 * D.

  6. 繼續尋找Xn使用新的D,直到我們迭代足夠多的時間,以便我們有我們需要的精度。 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,結果應該是正確的。

更新:此算法工作正常。