📄 flosqr.asm
字号:
;********************FLOSQR********************
;本程序实现标准浮点数开平方SQRT(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:SQRT(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,两重堆栈。
;说明: 用户需自行指定 AARGB4,AARGB5,BARGB3,CEXP,DEXP,DARGB1,DARGB2,DARGB3
IFNDEF FLOSQR1
#DEFINE FLOSQR1
INCLUDE "RND3224.ASM"
INCLUDE "MUAD32.ASM"
INCLUDE "FXM2424U.ASM"
FLOSQR BTFSC AARGB0,MSB ;检查是否为负数
GOTO DOMERR
CLRF AARGB2
MOVF AEXP,W
BTFSC STATUS,Z ;是0则返回
RETLW 0x00
MOVF AEXP,W ;将指数保存在CEXP中
MOVWF CEXP
MOVF FPFLAGS,W ;将RND标志保存在DARGB3中
MOVWF DARGB3
BCF FPFLAGS,RND ;不圆整
MOVLW .127 ;计算z
MOVWF AEXP
MOVF AEXP,W ;将z保存在DARG中
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
CLRF DARGB2
BTFSS AARGB0,MSB-1
GOTO SQRTL
SQRTH POL SQRT24H,4,0 ;在区间[1.5,2]上进行逼近
GOTO SQRTOK
SQRTL POL SQRT24L,4,0 ;在区间[1,1.5]上进行逼近
SQRTOK BTFSC CEXP,LSB ;指数是偶数还是奇数?
GOTO RRSQRTOK
;********************乘以SQRT(2)************
BSF AARGB0,MSB
MOVLW 0xB5 ; sqrt(2) = 1.41421356237
MOVWF BARGB0
MOVLW 0x04
MOVWF BARGB1
MOVLW 0xF3
MOVWF BARGB2
CALL FXM2424U
INCF AEXP,F
BTFSC AARGB0,MSB
GOTO RRSQRTOK
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
RRSQRTOK BCF AARGB0,MSB ;隐藏最高位的1
MOVLW .127
ADDWF CEXP,F
RRF CEXP,W ;指数除以2
MOVWF AEXP
BTFSS DARGB3,RND
RETLW 0x00
BSF FPFLAGS,RND
CALL RND3224
RETLW 0x00
DOMERR BSF FPFLAGS,DOM ;范围溢出
RETLW 0xFF
;在区间 [1.5,2]上的四次多项式系数COF
SQRT24H0 EQU 0x7D ; SQRT24H0 = 3.5963132863E-1
SQRT24H00 EQU 0x38
SQRT24H01 EQU 0x21
SQRT24H02 EQU 0x99
SQRT24H1 EQU 0x7E ; SQRT24H1 = 8.3106978456E-1
SQRT24H10 EQU 0x54
SQRT24H11 EQU 0xC0
SQRT24H12 EQU 0xFD
SQRT24H2 EQU 0x7C ; SQRT24H2 = -2.3944355047E-1
SQRT24H20 EQU 0xF5
SQRT24H21 EQU 0x30
SQRT24H22 EQU 0xB1
SQRT24H3 EQU 0x7A ; SQRT24H3 = 5.5047377031E-2
SQRT24H30 EQU 0x61
SQRT24H31 EQU 0x79
SQRT24H32 EQU 0x5C
SQRT24H4 EQU 0x77 ; SQRT24H4 = -5.6351436252E-3
SQRT24H40 EQU 0xB8
SQRT24H41 EQU 0xA7
SQRT24H42 EQU 0x03
;在区间[1,1.5]上的四次多项式系数COF
SQRT24L0 EQU 0x7D ; SQRT24L0 = 3.0221977303E-1
SQRT24L00 EQU 0x1A
SQRT24L01 EQU 0xBC
SQRT24L02 EQU 0x8B
SQRT24L1 EQU 0x7E ; SQRT24L1 = 9.8831235597E-1
SQRT24L10 EQU 0x7D
SQRT24L11 EQU 0x02
SQRT24L12 EQU 0x0A
SQRT24L2 EQU 0x7D ; SQRT24L2 = -4.0192034196E-1
SQRT24L20 EQU 0xCD
SQRT24L21 EQU 0xC8
SQRT24L22 EQU 0x81
SQRT24L3 EQU 0x7C ; SQRT24L3 = 1.3009144111E-1
SQRT24L30 EQU 0x05
SQRT24L31 EQU 0x36
SQRT24L32 EQU 0xB1
SQRT24L4 EQU 0x79 ; SQRT24L4 = -1.8702682470E-2
SQRT24L40 EQU 0x99
SQRT24L41 EQU 0x36
SQRT24L42 EQU 0x36
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -