新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機浮點數的實用快速降法

        單片機浮點數的實用快速降法

        作者: 時間:2012-03-08 來源:網絡 收藏

        4 程序源代碼

        限于篇幅,只給出源代碼中的關鍵部分,即有效數字的計算部分。

        ;被除數為x,除數為y

        ;用yh,hl分別表示y的高16位和低16位

        ...

        ;假設x,y的有效數字部分分別在(dx,cx)和(bx,ax)中

        ;計算預估值Q0'=(x/4)/yh

        shrl cx,#2 ;計算x/4

        divu cx,bx ;計算(x/4)÷yh

        ld fx, cx ;把商暫放入寄存器fx,即Q0'的高16位有 ;效數字

        clr cx

        divu cx,bx ;把余數末尾添0后面再除以yh

        ld ex,cx ;把商暫放入寄存器ex,即Q0'

        ;的低16位有效數字

        ;(fx,ex)=Q0'

        ;計算修正因子 Q1=(yh-yl)/yh

        cmp ax,0 ;判斷yl是否為0

        jne getQ1 ;若yl非0,計算修正因數Q1

        ld ax,ex ;若yl=0,修正因數Q1=1

        ld bx,fx ;(Q0'×Q1)=Q0',可以直接計算Q

        sjmp getQ

        getQ1:

        ld hx,bx ;把yh放于寄存器hx中

        neg ax

        dec bx ;計算yh-yl

        divu ax,hx ;計算Q1=(yh-yl)÷yh

        ld dx,ax ;把商暫時放入寄存器dx,即Q1的高16位有;效數字

        clr ax

        divu ax,hx ;把余數末尾添0后再除以yh,得Q1的;低16位有效數字

        ld bx dx ;(bx,ax)=Q1

        ;計算Q0'×Q1=(fx,ex)×(bx,ax),只取32位有效數字

        ld hx,bx

        mulu cx,bx,ex ;(dx,cx)=bx×ex

        mulu ax,fx ;(bx,ax)=ax×fx

        clr ex

        add cx,ax

        addc dx,bx

        addc ex,0 ;(ex,dx,cx)=(dx,cx)+(bx,ax)

        mulu ax,fx,hx ;(bx,ax)=fx×hx

        add ax,dx ;(bx,ax)=(bx,ax)+(ex,dx)

        addc bx,ex ;(bx,ax)=Q0'×Q1

        ;計算校準值Q=(Q0' ×Q1)×4并調整階碼

        getQ:

        ...

        代碼到這里為止,商的有效數字已經全部求出。只要再執行一些調整階碼的操作,就可以得到最終結果。

        在作者開發的一個80C196KC單片機系統中,涉及到了二進制-十進制數制轉換、分段線性插值、數字濾波等大量的運算,都是靠加減乘除等底層函數來實現的。

        此外,本算法思路清晰,因此很容易加以推廣。例如,為了得到更高的精度,可取修正因子:

        則相對誤差,轉化為十進制,有效數字高達14位。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宁海县| 高州市| 泾川县| 蓬莱市| 平昌县| 利辛县| 香港| 孟州市| 都兰县| 绥芬河市| 荣成市| 洛阳市| 宁乡县| 高淳县| 搜索| 阳泉市| 鞍山市| 西乌珠穆沁旗| 日喀则市| 九龙县| 永昌县| 永新县| 松溪县| 九台市| 福泉市| 信丰县| 白银市| 始兴县| 瓮安县| 商都县| 柞水县| 永康市| 丰原市| 荆门市| 筠连县| 贵德县| 乌拉特前旗| 台山市| 荆州市| 古丈县| 剑阁县|