DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 111|回复: 0
打印 上一主题 下一主题

MCS-96/196三字节浮点库

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 17:03:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                   
应用于MCS-96系列单片机的浮点库有许多。大多数是五字节(8位十进制数),运行速度慢。而在实际应用中,许多计算只需4位十进制数即可。

为此,本人参考周航慈教授编写的《单片机应用程序设计技术》(北京航空航天大学出版社),编写了MCS-96/196三字节浮点库,运行速度快( 12 MHz 196KC数值转换:150us,四则运算:80us)。

程序简洁(1.3 KB),可任意浮动。占用资源:1AH"25H,堆栈深度:2字节。可将程序清单,粘于源程序后,直接调用。

本浮点子程序库只包含浮点加(FADD)、减(FSUB)、乘(FMUL)、除(FDIV)等子程序。程序清单见本刊网站:www.dpj.com.cn。

为便于读者使用本程序库,现将有关约定说明如下。

双字节定点操作数。用[CX]或[DX]表示存放在由CX或DX指示的连续单元中的数据,地址小的单元存放高字节。如果[CX]=1234H,若(CX)=30H,则(30H)=12H,(31H)=34H。

二进制浮点操作数。用3个字节表示:第1个字节的最高位为数符,其余7位为阶码(补码形式);第2个字节为尾数的高字节;第3个字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在程序说明中,也用[CX]或[DX]来表示CX或DX指示的浮点操作数。例如:当[CX]=-6.000时,二进制浮点数表示为83C000H;若(CX)=30H,则(30H)=83H (31H)=0C0H,(32H)=00H。

十进制浮点操作数。用3个字节表示:第1个字节的最高位为数符,其余7位为阶码(二进制补码形式);第2个字节为尾数的高字节;第3个字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1时,阶码等于 80H 减去小数点后面零的个数。例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH。在程序说明中,用[CX]或[DX]来表示CX或DX指示的十进制浮点操作数。例如,有一个十进制浮点操作数存放在30H、31H、32H中,数值是-0.07315,即 -0.7315×10-1,则(30H)=0FFH,31H=73H,(32H)=15H。若用[CX]来指向它,则应使(CX)=30H。

运算精度。单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于3/105;单次二进制浮点超越函数运算的精度优于1/104,BCD码浮点数本身的精度比较低(1/104" 1/103),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管哪种数据格式,随着连续运算次数的增加,精度都会下降。

工作区。数据工作区固定在AX、BX、CX、DX、EX,标志工作区固定在1AH、1B单元。

子程序调用范例。用积木方式(或流水线方式)完成一个公式的计算。以浮点运算为例:
计算y=ab/c+d

已知:a=-123.4,b=0.757 7,c=56.34,d=1.276,分别存放在30H、33H、36H、39H开始的三个连续单元中。用BCD码浮点数表示时,分别为a= 831234H,b=007577H,c=025634H,d=011276H。求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用。程序如下:

;****************************************
AX EQU 1CH
BX EQU AX+2
CX EQU BX+2
DX EQU CX+2
EX EQU DX+2
;************************
AH EQU AX+1
AL EQU AX
BH EQU BX+1
BL EQU BX
CH EQU CX+1
CL EQU CX
DH EQU DX+1
DL EQU DX
EH EQU EX+1
EL EQU EX
ORG 2080h
main:
LD sp,#200h
TEST:
LDB CX,#39H ;指向BCD码浮点操作数d
LCALL BTOF ;将其转换成二进制浮点操作数
LDB CX,#36H ;指向BCD码浮点操作数c
LCALL BTOF ;将其转换成二进制浮点操作数
LDB CX,#33H ;指向BCD码浮点操作数b
LCALL BTOF ;将其转换成二进制浮点操作数
LDB CX,#30H ;指向BCD码浮点操作数a
LCALL BTOF ;将其转换成二进制浮点操作数
LDB DX,#33H ;指向二进制浮点操作数b
LCALL FMUL ;进行浮点乘法运算
LDB DX,#36H ;指向二进制浮点操作数c
LCALL FDIV ;进行浮点除法运算
LDB DX,#39H ;指向二进制浮点操作数d
LCALL FADD ;进行浮点加法运算
LCALL FTOB ;将结果转换成BCD码浮点数
STOP: LJMP STOP
;运行结果,[CX]=803836H,即y=-0.383 6。比较精确的结果应该是-0.383 57。

            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-9-24 01:23 , 耗时 0.109054 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表