單片機(jī)浮點(diǎn)數(shù)的實(shí)用快速降法
4 程序源代碼
限于篇幅,只給出源代碼中的關(guān)鍵部分,即有效數(shù)字的計(jì)算部分。
;被除數(shù)為x,除數(shù)為y
;用yh,hl分別表示y的高16位和低16位
...
;假設(shè)x,y的有效數(shù)字部分分別在(dx,cx)和(bx,ax)中
;計(jì)算預(yù)估值Q0'=(x/4)/yh
shrl cx,#2 ;計(jì)算x/4
divu cx,bx ;計(jì)算(x/4)÷yh
ld fx, cx ;把商暫放入寄存器fx,即Q0'的高16位有 ;效數(shù)字
clr cx
divu cx,bx ;把余數(shù)末尾添0后面再除以yh
ld ex,cx ;把商暫放入寄存器ex,即Q0'
;的低16位有效數(shù)字
;(fx,ex)=Q0'
;計(jì)算修正因子 Q1=(yh-yl)/yh
cmp ax,0 ;判斷yl是否為0
jne getQ1 ;若yl非0,計(jì)算修正因數(shù)Q1
ld ax,ex ;若yl=0,修正因數(shù)Q1=1
ld bx,fx ;(Q0'×Q1)=Q0',可以直接計(jì)算Q
sjmp getQ
getQ1:
ld hx,bx ;把yh放于寄存器hx中
neg ax
dec bx ;計(jì)算yh-yl
divu ax,hx ;計(jì)算Q1=(yh-yl)÷yh
ld dx,ax ;把商暫時(shí)放入寄存器dx,即Q1的高16位有;效數(shù)字
clr ax
divu ax,hx ;把余數(shù)末尾添0后再除以yh,得Q1的;低16位有效數(shù)字
ld bx dx ;(bx,ax)=Q1
;計(jì)算Q0'×Q1=(fx,ex)×(bx,ax),只取32位有效數(shù)字
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
;計(jì)算校準(zhǔn)值Q=(Q0' ×Q1)×4并調(diào)整階碼
getQ:
...
代碼到這里為止,浮點(diǎn)數(shù)商的有效數(shù)字已經(jīng)全部求出。只要再執(zhí)行一些調(diào)整浮點(diǎn)數(shù)階碼的操作,就可以得到最終結(jié)果。
在作者開發(fā)的一個(gè)80C196KC單片機(jī)系統(tǒng)中,涉及到了二進(jìn)制-十進(jìn)制數(shù)制轉(zhuǎn)換、分段線性插值、數(shù)字濾波等大量浮點(diǎn)數(shù)的運(yùn)算,都是靠加減乘除等底層函數(shù)來實(shí)現(xiàn)的。
此外,本算法思路清晰,因此很容易加以推廣。例如,為了得到更高的精度,可取修正因子:
則相對(duì)誤差,轉(zhuǎn)化為十進(jìn)制,有效數(shù)字高達(dá)14位。
評(píng)論