单片机浮点数的实用快速降法
扫描二维码
随时随地手机看文章
;;; 摘要:介绍一种在8096/96系列单片机上实现的单精度浮点数快速除法。该算法采用了预估一修正的数值计算方法,并充分利用了16位CPU中的乘除法指令,计算速度快、精度高,有很强的实用性。 ;;; 关键词:浮点数 除法 尾数 预估-修正 误差 精度 在较为复杂的单片机系统中,为扩大取值范围,实现复杂的计算和控制,一般都要涉及浮点数的运算。而一般单片机是没有浮点数运算指令的,必须自行编制相应软件。在进行除法计算时,通常使用的方法是比较除法[1],即利用循环移位和减法操作来得到24~32位商,效率很低。有些文献给出了一些改进方法[2],但思想不清晰,很难推广使用。这里给出一种浮点数除法运算的实用快速算法。该方法以数值计算中的预估-修正方法为指导,充分利用了16位单片机的乘除法功能,很轻易地实现了浮点数的除法。 1 浮点数格式 IEEE的浮点数标准规定了单精度(4字节)、双精度(8字节)和扩展精度(10字节)三种浮点数的格式。最常用的是单精度浮点数,格式如图1所示。但是这种格式的阶码不在同一个字节单元内,不易寻址,从而会影响运算速度。 通常在单片机上采用的是一种变形格式的浮点数,如图2所示。其中的23位尾数加上隐含的最高位1,构成一个定点原码小数,即尾数为小于1大于等于0.5的小数。有关浮点数格式的详细内容请参考有关文献[1][2]。 2 快速除法的算法原理 在16位单片机中只有16位的乘除法,而浮点数的精度(即尾数的有效位数)达24位,因此无法直接相除,但依然可以利用16位的乘除法指令来实现24位除法。不过,如果只进行一次16位的除法必定会带来很大误差,因此问题的关键在于如何消除这个误差,从而达到要求的精度。这其实就是通常数值计算中所采用的预估-修正方法。 假设两个浮点数经过预处理后,被除数和除数尾数扩展为32位(末8位为0)分别放入X和Y中。邻YL为Y的低16位,并记YH=Y-YL。显然YH≈Y,X/Y与Y/YH相差不多: (X/Y)/(X/YH)=(YH/Y) =YH/(YH+YL) =1/(1+YL/YH) ≈1-YL/YH =(YH-YL)/YL 可见只需要在X/YH的基础上再乘以一个修正因子(YH-YL)/YH,就可以得到X/Y的一次校准值。不难证明这个值已经达到了24位的精度要求。事实上,相对误差满足:
;;; 这说明这个一次校准值完全可以作为最终的结果。 3 算法的具体实现 在具体实现本算法时,主要经过下列步骤: (1)计算预估值Q0=X/YH; (2)计算修正因子Q1=(YH-YL)/YH; (3)计算校准值Q=Q0×Q1,并作为最后结果。 这里的YH虽仍是32