如何在8051单片机上实现1/(1/X1+1/X2)表达式计算?
AT89C51平台下该表达式的可行实现方案
别上来就硬写浮点运算,先从根源减少运算复杂度:
- 你要算的
1/(1/X1 + 1/X2)可以直接通分化简为(X1 * X2)/(X1 + X2),根本不需要先对两个变量做倒数操作,只要先算分子乘积、分母求和,最后做一次除法就能出结果。如果X1、X2是整数变量,这套流程全程可以用定点整数运算完成,完全不需要引入浮点机制,是资源最省、速度最快的方案。
要是X1、X2是8位无符号数(取值0~255),直接用8051自带的MUL AB、DIV AB硬指令就能实现,核心汇编逻辑参考:; 约定X1存在30H单元,X2存在31H单元 ; 第一步:算分母X1+X2 MOV A, 30H ADD A, 31H MOV R0, A ; R0暂存8位和 ; 第二步:算分子X1*X2 MOV A, 30H MOV B, 31H MUL AB ; 乘积默认存在B(高8位)、A(低8位),即BA=X1*X2 ; 第三步:16位乘积除以8位和,得到结果 MOV R1, B MOV B, R0 DIV AB MOV R2, A ; R2存结果高8位 MOV A, R1 DIV AB MOV R3, A ; R3存结果低8位,余数存在B中,需要小数部分可继续迭代计算 - 如果X1、X2本身带小数、或者取值范围不大但对结果精度有要求,别用通用浮点数,上Q格式定点数就够:
推荐用Q8格式,每个变量占2字节,高8位存整数部分、低8位存小数部分,加减乘除的实现逻辑比浮点简单得多,整套运算代码占ROM不到500字节,运算速度比软浮点快3倍以上,完全适配AT89C51的资源水平。
运算规则也很简单:加法直接做16位整数加、乘法得到32位结果后右移8位对齐小数点、除法先把被除数左移8位再做整除,直接就能得到Q8格式的结果。 - 如果X1、X2取值跨度极大,定点数覆盖不了动态范围必须用浮点,就用3字节精简软浮点方案,别用标准4字节IEEE浮点:
3字节浮点格式分配1字节带符号阶码、2字节尾数,整套加减乘除、倒数的运算子程序总大小不到1K ROM,完全塞得下AT89C51的4K程序空间。你只需要提前把X1、X2转换成对应浮点格式,依次调用浮点除法算1/X1、1/X2,调用浮点加法算两者的和,最后再调用一次浮点除法算和的倒数就能得到结果,不需要自己处理对阶、规格化、舍入这些底层细节。
选型优先级永远是:化简后纯整数运算 > Q格式定点运算 > 精简软浮点运算,越靠前的方案资源占用越少、运行越稳定,不要一开始就上来啃浮点运算的硬骨头,平白浪费单片机本就紧张的ROM和RAM。
内容的提问来源于stack exchange,提问作者Ko Ye
相关产品推荐
相关产品推荐

