2015-06-19 108 views
1

我需要實現一個數字復發平方根通用浮點格式,使得exp_size + mant_size + 1 < = 64數字復發平方根

我基本上沿襲了實施建議這裏 handbook of floating point arithmetic在軟件實現的浮點運算符。

我試圖測試我的實現(不是一個詳盡的測試),基本上像32位格式它看起來像正常工作,而像尾數= 10格式,指數= 5爲輸入x = 0.25給我0.5它顯然給我0.707031。

,所以我是遊蕩,如果對小幅面也許數字復發的方法有一些限制或沒有或只是......我的實現是壞的......

我希望你能幫助我...這是一個痛苦從0實現這個東西...

+0

FPU的計算都在較高的比特進行計數mantisa和指數(i8087 + FPU的內部編號表示是80bit的),結果是然後截斷到輸出。如果你模仿這個,你得到了正確的答案。如果你不想這樣,你可以使用bin搜索方法(由於需要乘法運算會慢一點,但結果應該更精確) – Spektre

+0

我不確定要理解你說的是什麼。但是,基本上「我的」方法是計算尾數大小的數字,尾數大小的數字+1,這是因爲平方根需要1位數字才能正確舍入。但對我來說,聽起來有點奇怪,例如,對於10位尾數精度(例如)和5的指數,我沒有得到輸入0.25的正確答案。 – user8469759

回答

0

它是很難的極端看你的代碼,但你應該:

  1. 測試的所有操作數組合

    • 如果它適用於簡單的例子,並不意味着它適用於所有的人
  2. 校驗位掩碼

    • 當你使用那麼32位導致你寫的是精細
    • 時使用10然後不是
    • 這是暗示溢出某處
    • 你確定你hav e爲R保留/屏蔽了正確的位數?
    • 設定R 2位的更多然後Q(1比特的準確性和1位爲符號)
    • ,你也應該處理R作爲二進制補碼
    • Q是d位和無符號
    • 的一半

找不到你的算法(你鏈接不允許我那本書還那麼265頁面,SQRT開始可能會出現一些不兼容我用好老戲),但是這是一個最接近我在谷歌找到( Non-Restoring-SQRT)在FPGA上的一些PDF研究和硬件實現以及清除該錯誤之後S和測試,這是我的代碼在C++和測試:

DWORD u32_sqrt(DWORD D) // 32bit 
    { 
    const int _bits =32; 
    const DWORD _R_mask=(4<<(_bits>>1))-1; 
    const DWORD _R_sign= 2<<(_bits>>1); 
    DWORD Q=0; // u(_bits/2 ) result (quotient) 
    DWORD R=0; // i(_bits/2 + 2) 2os complement (remainder) R=D-Q*Q 
    for (int i=_bits-2;i>=0;i-=2) 
     { 
     if (DWORD(R&_R_sign)){ R=(R<<2)|((D>>i)&3); R+=(Q<<2)|3; } // R< 0 
     else    { R=(R<<2)|((D>>i)&3); R-=(Q<<2)|1; } // R>=0 
     R&=_R_mask; Q<<=1; if (!DWORD(R&_R_sign)) Q|=1;    // R>=0 
     } 
    return Q; 
    } 
+0

我還沒有做過徹底的測試是真的,但基本上是這樣__ms = 23,__es = 8,這是本書的相同算法。我也檢查了面具的東西,應該沒問題。如果你想讓我把你感興趣的書的一部分傳給你pdf,也許這會讓你更容易理解這個問題(我認爲這本書的鏈接是誠實的......)。 – user8469759

+0

但無論如何......你對我的代碼有何建議?你認爲這是提醒R的問題?你認爲有更安全的方法來做同樣的計算嗎? 其實,代碼的核心無論如何是for循環。變量名取自該書,並在那裏報告解釋。如果你認爲我應該解釋更好的東西,請讓我知道... – user8469759

+0

你可以在這裏找到符號與我的相同的論文http://www.researchgate.net/publication/4273059_Faster_floating-point_square_root_for_integer_processors – user8469759