原创 单片机浮点数的实用快速降法

2009-8-13 08:53 1922 7 7 分类: MCU/ 嵌入式
摘要:介绍一种在8096/96系列单片机上实现的单精度浮点数快速除法。该算法采用了预估一修正的数值计算方法,并充分利用了16位CPU中的乘除法指令,计算速度快、精度高,有很强的实用性。K-{cJ6b px4{0 电子园51单片机学习网 ?fUf3^O%W

关键词:浮点数 除法 尾数 预估-修正 误差 精度

H$?"rq y K6mi0

Y6\,m(F V1\0在较为复杂的单片机系统中,为扩大取值范围,实现复杂的计算和控制,一般都要涉及浮点数的运算。而一般单片机是没有浮点数运算指令的,必须自行编制相应软件。在进行除法计算时,通常使用的方法是比较除法[1],即利用循环移位和减法操作来得到24~32位商,效率很低。有些文献给出了一些改进方法[2],但思想不清晰,很难推广使用。这里给出一种浮点数除法运算的实用快速算法。该方法以数值计算中的预估-修正方法为指导,充分利用了16位单片机的乘除法功能,很轻易地实现了浮点数的除法。20051130010526476.gif电子园51单片机学习网(tv5`([g6D7qi.|0^enB


"cRh7n:|,k3w01 浮点数格式

@3`f#o(v.\y5it:P0 电子园51单片机学习网@ CJ4ZoC:Z r9I+v

IEEE的浮点数标准规定了单精度(4字节)、双精度(8字节)和扩展精度(10字节)三种浮点数的格式。最常用的是单精度浮点数,格式如图1所示。但是这种格式的阶码不在同一个字节单元内,不易寻址,从而会影响运算速度。电子园51单片机学习网H^"s`F$l`o

电子园51单片机学习网*s{|1XRV

通常在单片机上采用的是一种变形格式的浮点数,如图2所示。其中的23位尾数加上隐含的最高位1,构成一个定点原码小数,即尾数为小于1大于等于0.5的小数。有关浮点数格式的详细内容请参考有关文献[1][2]。

Z;}Cv @0Qlp0

7F#r?R:_7WG02 快速除法的算法原理

s$fw F,]$t*V8c0 电子园51单片机学习网6I{'I5?"P;Y:r,C

在16 位单片机中只有16位的乘除法,而浮点数的精度(即尾数的有效位数)达24位,因此无法直接相除,但依然可以利用16位的乘除法指令来实现24位除法。不过,如果只进行一次16位的除法必定会带来很大误差,因此问题的关键在于如何消除这个误差,从而达到要求的精度。这其实就是通常数值计算中所采用的预估- 修正方法。20051130010526640.gif

%t|YduGg _0

k*pH9`1}o'N0假设两个浮点数经过预处理后,被除数和除数尾数扩展为32位(末8位为0)分别放入X和Y中。邻YL为Y的低16位,并记YH=Y-YL。显然YH≈Y,X/Y与Y/YH相差不多:

+?0@T+GAVE-XpdM2ml0

)Q2Wvh^C0(X/Y)/(X/YH)=(YH/Y)电子园51单片机学习网\ml ]| U

电子园51单片机学习网"B}5US SDJ?#k;D]

=YH/(YH+YL)电子园51单片机学习网,Yvr e.@%@d!b

电子园51单片机学习网3Ch~v ?)Us

=1/(1+YL/YH)电子园51单片机学习网3F%Po1Wv;c

电子园51单片机学习网L%x a:?N

≈1-YL/YH电子园51单片机学习网4^Wp$X0C4GE2`


r(}A5FZ0S)yP0=(YH-YL)/YL

rA:IyS0

.I#lM|Q:HRT4N0可见只需要在X/YH的基础上再乘以一个修正因子(YH-YL)/YH,就可以得到X/Y的一次校准值。不难证明这个值已经达到了24位的精度要求。事实上,相对误差满足:电子园51单片机学习网c zeM7Z-R"AP c
20051130010528167.gif
,M_[v Wmz0
电子园51单片机学习网h:Q A"J8kn5z

    这说明这个一次校准值完全可以作为最终的结果。

v8Ume9f4\X6V03 算法的具体实现电子园51单片机学习网:?*~ TX%m8@ |;^|z,a O Z0e

电子园51单片机学习网grk\RU.L]HU2R

在具体实现本算法时,主要经过下列步骤:电子园51单片机学习网!U8Lp)by:nU4n

电子园51单片机学习网&g!j0o,xC?+C+[K

(1)计算预估值Q0=X/YH;电子园51单片机学习网$BZ%bJ't


yXbx5VB X*^1Q0(2)计算修正因子Q1=(YH-YL)/YH;

A_#p }V6JSFL0

8h {W w)fM;S0(3)计算校准值Q=Q0×Q1,并作为最后结果。20051130010529669.gif电子园51单片机学习网&q:r[v l6~Q7Kc,?


)sabjl4]0这里的YH虽仍是32位,但其低16位已为0,计算时可以将它视为16位数,这不会影响计算精度。通过两次16位除法,就可得到精确的32位结果。例如,计算Q0时,第一次除法,X除以YH的高16位,得到的商为Q0的高16位,而16位余数末尾添0成32位,再除以YH的高16位,得到Q0的低16位(余数舍去)。由此得到了32位的Q0。电子园51单片机学习网"Bd| MS


c$IJG S5tgt R0在具体运算中,X应选除以4(X左移2位),以保证Q0不会溢出(YH取高16位):电子园51单片机学习网8z"t{ k~6Cmr.m


1p&D9@wTbp%p0Q0'=(Y/4)/YH≤(0ffffff00H/4)/8000H=7fffh

'k2DB I;Mb0

\?)lp9z]`'K9d)vj0由于X为32位(末8位为0),这一操作不影响有效数字。而Q1(YH-YL)/YH≤1,不存在溢出的问题。最后计算校准值Q时,有Q=4Q0'Q1。电子园51单片机学习网*py7vx2NM

电子园51单片机学习网3w$l:gVR f4k

在计算Q0'、Q1时,均进行了两次16位除法,使得Q0'、Q1均为精确的32位,保证了计算过程中的精度,减小了累积误差。对于YL=0即除数只有16位有效数字的特殊情况,直接有Q1=1,还能省去两次16位除法。电子园51单片机学习网T8j%M8Z3EIP


IH^U:W0在计算Q时,则通过3次16位乘法实现了32位乘法,取结果的高32位,即得Q。电子园51单片机学习网@aD xK T;Z

电子园51单片机学习网i8d#dj^!V6m

整个算法至多只须用4次除法、3次乘法和5次加法,就求得了浮点数商的尾数,可见计算效率是很高的,保证了运算速度。

Jj|8^tdH4WLc0

j9i4^}w0浮点数除法流程图如图3所示。电子园51单片机学习网gu$n#k8k b"aLc


8DcRE8@w b04 程序源代码电子园51单片机学习网k3CJ._M,a2J7j

电子园51单片机学习网z uL9^oWXR#S6_$xb O y

限于篇幅,只给出源代码中的关键部分,即有效数字的计算部分。电子园51单片机学习网K bwS8F!c%jFR

电子园51单片机学习网"H/Wx F[sb

;被除数为x,除数为y电子园51单片机学习网5m/n `5e F,Z


!Yi K(OqPj&m0;用yh,hl分别表示y的高16位和低16位

;m!lU%J6g?0 电子园51单片机学习网]Y ^t PPM&v

...电子园51单片机学习网P6bP7[,h.z9N0d


3Y0ov \5O-C7@#r;K;IS ?0;假设x,y的有效数字部分分别在(dx,cx)和(bx,ax)中

*LBy7[ dDi0 电子园51单片机学习网[m5^1H~Fb

;计算预估值Q0'=(x/4)/yh

tE/Z*T!DT.S1R4@0 电子园51单片机学习网7l#X`0Z,a {{

shrl cx,#2 ;计算x/4

u2d+D]!Q4x$k0 电子园51单片机学习网l&H-Q6CVD2o5` y4p

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

0gD$F9k/`t3xY0 电子园51单片机学习网}V5?&P _9Y

ld fx, cx ;把商暂放入寄存器fx,即Q0'的高16位有 ;效数字电子园51单片机学习网`&C@6Z%Kz+ce


V&qY/D4[GC p @b0clr cx电子园51单片机学习网Yp L&d&I$x6O?}


n(M:u$M3d0divu cx,bx ;把余数末尾添0后面再除以yh

"sm;Ce7a!WVH0

*a)xU(Y9[%b0c;S&u N0ld ex,cx ;把商暂放入寄存器ex,即Q0'

k;um)a6J\0

;p9kY5U5?/j&H Y F;\9|0;的低16位有效数字

A5l9k)g3vMc1t#x$m0

%Pvg+LK.v1SBt0;(fx,ex)=Q0'

7C/s)p4C o;}0

,I;R-O(h9_$ql0;计算修正因子 Q1=(yh-yl)/yh电子园51单片机学习网2J$_-v l&L#?^


AGf ac ~}V0cmp ax,0 ;判断yl是否为0

A.wBvB:x;w&C0

^2L"D!Z,[t]p*cO8b0jne getQ1 ;若yl非0,计算修正因数Q1

j?ih&|+xKK0

xmW,j!f8@r`I0ld ax,ex ;若yl=0,修正因数Q1=1

(ih;I;JcQ0

0jQP&E/],CHJo0ld bx,fx ;(Q0'×Q1)=Q0',可以直接计算Q电子园51单片机学习网:dc*c4|{;z-u.k P*}


G6[*w^;P5~$|zJK0sjmp getQ电子园51单片机学习网pIt%\.Q n


P+JpBy0getQ1:

)x.fp4AIn0 电子园51单片机学习网G'^!O$v#z;{+d1`

ld hx,bx ;把yh放于寄存器hx中电子园51单片机学习网x-{6w7nd)g!t


*u?N'Z)cO"O S%h L Q0neg ax

2\-p$]"J ` e k5S0

C6}n V,q1e,uN;V s0dec bx ;计算yh-yl电子园51单片机学习网[/f.bP\ x

电子园51单片机学习网 VX xB mt;@0@

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

Ft1f;r UZ |j0

h [$pWIL0ld dx,ax ;把商暂时放入寄存器dx,即Q1的高16位有;效数字

!s'SX pSa tX0

.X1b4R2E/]/lZ0clr ax

@/p8A7pT1O3g?0 电子园51单片机学习网8m?}$m&|'qGX*KP

divu ax,hx ;把余数末尾添0后再除以yh,得Q1的;低16位有效数字电子园51单片机学习网4x4m+xO@'e7Hl Z


L-E%`$tY*D e2~0ld bx dx ;(bx,ax)=Q1电子园51单片机学习网:uD K$O[ p

电子园51单片机学习网Y(K(~ s @5C

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

8Uu5@'b,{L5C0

T1W:dwf,m,?Tw*z%F0ld hx,bx电子园51单片机学习网m3s9@,mEF


%K5x!Vp9vJE0mulu cx,bx,ex ;(dx,cx)=bx×ex

.DrarRHfw qoj0

t7SY1h8u0mulu ax,fx ;(bx,ax)=ax×fx电子园51单片机学习网 m#@hY-QE.f

电子园51单片机学习网2L)`!l5a+\)?

clr ex

N+K6aW~VH0 电子园51单片机学习网W6V5q.~4V'Q-B

add cx,ax电子园51单片机学习网{9u+\ ?'n I%@2D

电子园51单片机学习网2o8HoWC Z3x

addc dx,bx电子园51单片机学习网0`6C]8K.{4Rv


C`Y t#V7e6k9{0addc ex,0 ;(ex,dx,cx)=(dx,cx)+(bx,ax)

~GQS@0k4DI0

8qf1{Crx5m9J0mulu ax,fx,hx ;(bx,ax)=fx×hx电子园51单片机学习网5PZD%X6m1O(j~


[ ? O}1w0add ax,dx ;(bx,ax)=(bx,ax)+(ex,dx)电子园51单片机学习网\E_Bd VHR2P0Z.LS

电子园51单片机学习网4A,QL/v0p

addc bx,ex ;(bx,ax)=Q0'×Q1电子园51单片机学习网y"`:k"YazP


|._OUz~0;计算校准值Q=(Q0' ×Q1)×4并调整阶码电子园51单片机学习网 Y3@Cw*z dy%`q

电子园51单片机学习网E1g |ox/fGq

getQ:电子园51单片机学习网 Js(`@-@ H6L


9S3Me*H_xt0...电子园51单片机学习网"Ix0got-t

电子园51单片机学习网$y$h-{0QsdJ

代码到这里为止,浮点数商的有效数字已经全部求出。只要再执行一些调整浮点数阶码的操作,就可以得到最终结果。

P HL(N.S5E!{V p0 电子园51单片机学习网M5S2^%l1i9eKy

在作者开发的一个80C196KC单片机系统中,涉及到了二进制-十进制数制转换、分段线性插值、数字滤波等大量浮点数的运算,都是靠加减乘除等底层函数来实现的。电子园51单片机学习网-zW/d]4ST6X f+?


6\ YL7a-r1^/Se[.m2E0此外,本算法思路清晰,因此很容易加以推广。例如,为了得到更高的精度,可取修正因子:
0X4mT#|6o8A)JO020051130010529870.gif电子园51单片机学习网 L\Cd K$d.@ ~D
电子园51单片机学习网{e~$Op.z8aPl

    则相对误差20051130010530839.gif,转化为十进制,有效数字高达14位。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条