本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合:
1.小型库(fq51a.asm):只包含浮点加、减、乘、除子程序。
2.中型库(fq51b.asm):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、
数制转换等子程序。
3.大型库(fq51.asm):包含本说明书中的全部子程序。
为便于读者使用本程序库,先将有关约定说明如下:
1.双字节定点操作数:用[r0]或[r1]来表示存放在由r0或r1指示的连续单元中的数
据,地址小的单元存放高字节。如果[r0]=1234h,若(r0)=30h,则(30h)=12h,(31h)=34h。
2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为
阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节
纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在
程序说明中,也用[r0]或[r1]来表示r0或r1指示的浮点操作数,例如:当[r0]=-6.000时,
则二进制浮点数表示为83c000h。若(r0)=30h,则(30h)=83h,(31h)=0c0h,(32h)=00h。
3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为
阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用
双字节bcd码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数
部分的位数,如 876.5 的阶码是03h,-876.5 的阶码是 83h;当十进制数的绝对值小于1
时,阶码就等于 80h 减去小数点后面零的个数,例如 0.00382 的阶码是 7eh,-0.00382
的阶码是 0feh。在程序说明中,用[r0]或[r1]来表示r0或r1指示的十进制浮点操作数。例
如有一个十进制浮点操作数存放在30h、31h、32h中,数值是 -0.07315,即-0.7315乘以10
的-1次方,则(30h)=0ffh,31h=73h,(32h)=15h。若用[r0]来指向它,则应使(r0)=30h。
4.运算精度:单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算
的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;bcd码浮
点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或
输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。
5.工作区:数据工作区固定在a、b、r2~r7,数符或标志工作区固定在psw和23h单
元(位1ch~1fh)。在浮点系统中,r2、r3、r4和位1fh为第一工作区,r5、r6、r7和位1eh
为第二工作区。用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的
透明性。
6.子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用
积木方式(或流水线方式)完成一个公式的计算。以浮点运算为例:
计算 y = ln √ | sin (ab/c+d) |
已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它们分别存放在30h、33h、36h、
39h开始的连续三个单元中。用bcd码浮点数表示时,分别为a=831234h;b=007577h;
c=025634h;d=011276h。
求解过程:通过调用btof子程序,将各变量转换成二进制浮点操作数,再进行各
种运算,最后调用ftob子程序,还原成十进制形式,供输出使用。程序如下:
test: mov r0,#39h ;指向bcd码浮点操作数d
lcall btof ;将其转换成二进制浮点操作数
mov r0,#36h ;指向bcd码浮点操作数c
lcall btof ;将其转换成二进制浮点操作数
mov r0,#33h ;指向bcd码浮点操作数b
lcall btof ;将其转换成二进制浮点操作数
mov r0,#30h ;指向bcd码浮点操作数a
lcall btof ;将其转换成二进制浮点操作数
mov r1,#33h ;指向二进制浮点操作数b
lcall fmul ;进行浮点乘法运算
mov r1,#36h ;指向二进制浮点操作数c
lcall fdiv ;进行浮点除法运算
mov r1,#39h ;指向二进制浮点操作数d
lcall fadd ;进行浮点加法运算
lcall fsin ;进行浮点正弦运算
lcall fabs ;进行浮点绝对值运算
lcall fsqr ;进行浮点开平方运算
lcall fln ;进行浮点对数运算
lcall ftob ;将结果转换成bcd码浮点数
stop: ljmp stop
end
运行结果,[r0]=804915h,即y=-0.4915,比较精确的结果应该是-0.491437。