有关约定如下:
浮点数的格式(3字节):
数符(1)阶码(7) ,尾数高字节(H)、尾数低字节(L)
1. 二字节定点操作数。用[X]或[Y]表示存在由X或Y指示的连续单元中的数据,低地址单元存高字节。如果[X]=1234H,若[X]=60H,则(60H)=12H,(61H)=34H。
2. 二进制浮点操作数。 用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节。尾数用二字节纯小数(原码)来表示。当尾数的最高位为1时,称为规格化浮点数,简称操作数。在程序说明中,也用[X]或[Y]来表示X或Y指示的浮点操作数。
例如:(1)0.8表示为[X]=00 80 00 ,用二进制浮点数表示为00 CC CDH。若[X]=60H,则(60H)=00H,(61H)=0CCH,(62H)=0CDH。(2)-0.8表示为[X]=80 80 00 ,用二进制浮点数表示为80 CC CDH。若(X)=60H,则(60H)=80H,(61H)=0CCH,(62H)=0CDH。(3)0.08表示为[X]=7F 80 00,用二进制浮点数表示为7D A3 D7 H。若(X)=60H,则(60H)=7DH,(61H)=0A3H,(62H)=0D7H。(4)-0.08表示为[X]=FF 80 00 ,用二进制浮点数表示为FD A3 D7 H。若(X)=60H,则(60H)=0FDH,(61H)=0A3H,(62H)=0D7H。
3. 十进制浮点操作数。用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节。尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 123.4 的阶码是03H,-123.4 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00123 的阶码是 7EH,-0.00123的阶码是 0FEH。在程序说明中,用[X]或[Y]来表示X或Y指示的十进制浮点操作数。例如有一个十进制浮点操作数存放在60H、61H、62H中,数值是 -0.01234,即-0.1234×(10的-1次方),则(60H)=0FFH,(61H)=12H,(62H)=34H。若用[X]来指向它,则应使(X)=60H。
4. 运算精度。单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于1/65535;BCD码浮点数的精度为万分之一(4位有效数),不作为运算的操作数,仅用于输入或输出时的数制转换。不管哪种数据格式,随着连续运算的次数增加,精度都会下降。
5. 工作区。 数据工作区固定在R0、R12~R31中,数符或标志工作区固定在SREG寄存器中。
注意:用户不要在工作区中存放信息。
6. 数值转换子程序的执行时间(主频为8MHz时;与数据大小无关)为80μs;四则运算的执行时间为60μs,比12MHz的MCS-51系列单片机快10倍。
7. 子程序调用实例。 由于程序库特别注意了各子程序接口的相容性,很容易采用积木方式完成一个公式的计算。下面以浮点运算为例:
计算 y = ab/c+d
已知:a=-123.4,b=0.7577,c=56.34,d=1.276;它们分别存放在60H开始的连续单元中。用BCD码浮点数表示则a=831234H,b=007577H,c=025634H,d=011276H。
求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点数,再进行运算,最后调用FTOB子程序,还原成十进制形式。程序如下:
TEST:
LDI XL,S69 ;指向BCD码浮点操作数d
RCALL BTOF ;将其转换成二进制浮点操作数
LDI XL,S66 ;指向BCD码浮点操作数c
RCALL BTOF ;将其转换成二进制浮点操作数
LDI XL,S63 ;指向BCD码浮点操作数b
RCALL BTOF ;将其转换成二进制浮点操作数
LDI XL,S30 ;指向BCD码浮点操作数a
RCALL BTOF ;将其转换成二进制浮点操作数
LDI YL,S33 ;指向二进制浮点操作数b
RCALL FMULU ;浮点乘法运算
LDI YL,S66 ;指向二进制浮点操作数c
RCALL FDIV ;浮点除法运算
LDI YL,S69 ;指向二进制浮点操作数d
RCALL FADD ;浮点加法运算
RCALL FTOB ;将结果转换成BCD码浮点数
STOP: RJMP STOP
END
运行结果,[X]=803836H,即y=-0.3836,比较精确的结果应该是Y=-0.38357。
