使用减奇数法,进行16位数的开平方运算。
-------------------------------------------------------
命题:从 1 开始,连续 n 项奇数,等差数列求和,可以得到 n^2。
证明如下:
已知:1 + 3 + 5 + ... + (2n - 1) = (1 + (2n - 1)) * (n / 2) = n^2
对于任意正整数 N,都会有:N = n^2 + ε
式中ε是不可开方的、小于 2n - 1 的误差。
即有:N = 1 + 3 + 5 + … + (2n - 1) + ε
开方时,可在 N 中逐次减去 1、3、5、...,直到不够减为止,够减的次数 n,即为 N 的平方根的整数部分。
这种求平方根的方法,相比于牛顿迭代法等其它的方法,效率是最高的。
;==========================================
51单片机的程序如下。
设被开方数已经存在R2R3中,平方根存到R4中。
;------------------------------------------------------
;入口参数:R2 R3中为16位的被开方数 N
;出口参数:R4中为8位的平方根 n
SQRT16:
PUSH PSW ;保护现场
MOV R4, #0 ;从 0 开始
SQSTART:
SETB C ;R4 = 0 时,减 1、=1 时,减 3、…
CALL R23JR4 ;调用子程序,R2R3-R4-1
JC ENDSQR ;不够减时,转结束
CALL R23JR4 ;再调用子程序,R2R3-R4-0
JC ENDSQR
INC R4 ;够减,R4 加 1,即为根 n
SJMP SQSTART ;继续去减
ENDSQR:
POP PSW
RET ;开方结束了,平方根 n 在 R4
;-------------------------------
;入口参数:R2 R3 中为 16 位被减数,R4 中为 8 位减数
;出口参数:够减时Cy=0,R2 R3中为16位差数;不够减时Cy=1
;使用寄存器:A、PSW
R23JR4:
MOV A, R3
SUBB A, R4 ;R3-R4-Cy → A
MOV R3, A
MOV A, R2
SUBB A, #0 ;R2-0-Cy → A
MOV R2, A
RET
;==========================================
8086的汇编程序(核心部分)如下。
;------------------------------------------------------
MOV AX, [data] ;取来 N
MOV BX, 1 ;首项为 1
MOV CX, 0
_S_LOOP:
SUB AX, BX
JC _END ;减,到有借位为止
INC BX ;修改为 3、5、7...
INC BX
INC CX ;n加1
JMP _S_LOOP ;反复的减
_END:
MOV [root],CX ;保存n
;------------------------------------------------------
;==========================================
就这些了。
按照同样的思路,可以编写出进行计算阶乘的子程序FACT16,不知那位网友肯来试试?