📄 floln.asm
字号:
;********************FLOLN********************
;本程序求标准浮点数以E为底的对数函数Ln(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:Ln(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,3重堆栈。
;说明: 1.用户需指定AARGB4,AARGB5,BARGB3,EARGB3,DEXP,DARGB1,DARGB2,DARGB3,
; CEXP,CARGB0,CARGB1,CARGB2
IFNDEF FLOLN1
#DEFINE FLOLN1
INCLUDE "RND3224.ASM"
INCLUDE "FXM2424U.ASM"
INCLUDE "FPD32.ASM"
INCLUDE "DSTFLO.ASM"
INCLUDE "MUAD32.ASM"
FLOLN
CLRF AARGB2
BTFSC AARGB0,MSB ;自变量是否为负数
GOTO DOMERR24
MOVF AEXP,W ;自变量是否为0
BTFSC STATUS,Z
GOTO DOMERR24
MOVF FPFLAGS,W ;保存RND标志
MOVWF DARGB3
BCF FPFLAGS,RND ;屏蔽RND
MOVF AEXP,W
MOVWF EARGB3
MOVLW .127-1
SUBWF EARGB3,F
MOVWF AEXP
MOVLW 0xF3 ;0.70710678118655 = 7E3504F3
SUBWF AARGB2,W
MOVLW 0x04
MOVWF TEMP
BTFSS STATUS,C
INCFSZ TEMP,W
SUBWF AARGB1,W
MOVLW 0x35
MOVWF TEMP
BTFSS STATUS,C
INCFSZ TEMP,W
SUBWF AARGB0,W
BTFSS STATUS,C
GOTO LOG24L
; minimax rational approximation on [0,.sqrt(2)-1]
LOG24H
MOVLW 0x7F
MOVWF BEXP
CLRF BARGB0
CLRF BARGB1
CLRF BARGB2
CALL FPS32
MOVF AEXP,W
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
POLL1 LOG24HQ,2,0
MOVF AEXP,W
MOVWF CEXP
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF DEXP,W
MOVWF AEXP
MOVF DARGB0,W
MOVWF AARGB0
MOVF DARGB1,W
MOVWF AARGB1
MOVF DARGB2,W
MOVWF AARGB2
POL LOG24HP,1,0
MOVF CEXP,W
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPD32
GOTO LOG24OK
; minimax rational approximation on [1/sqrt(2)-1,0]
LOG24L
INCF AEXP,F
MOVLW 0x7F
MOVWF BEXP
CLRF BARGB0
CLRF BARGB1
CLRF BARGB2
CALL FPS32
DECF EARGB3,F
MOVF AEXP,W
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
POLL1 LOG24LQ,2,0
MOVF AEXP,W
MOVWF CEXP
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF DEXP,W
MOVWF AEXP
MOVF DARGB0,W
MOVWF AARGB0
MOVF DARGB1,W
MOVWF AARGB1
MOVF DARGB2,W
MOVWF AARGB2
POL LOG24LP,1,0
MOVF CEXP,W
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPD32
LOG24OK MOVF DEXP,W
MOVWF BEXP
MOVF DARGB0,W
MOVWF BARGB0
MOVF DARGB1,W
MOVWF BARGB1
MOVF DARGB2,W
MOVWF BARGB2
CALL FPM32
MOVF AEXP,W
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
CLRF AARGB0
MOVF EARGB3,W
MOVWF AARGB1
BTFSC AARGB1,MSB
COMF AARGB0,F
CALL DSTFLO
CLRF AARGB2
MOVF DEXP,W
MOVWF BEXP
MOVF DARGB0,W
MOVWF BARGB0
MOVF DARGB1,W
MOVWF BARGB1
MOVF DARGB2,W
MOVWF BARGB2
CALL FPA32
; fixed point multiplication by log(2)
MOVF AEXP,W
BTFSC STATUS,Z
RETLW 0x00
MOVF AARGB0,W
MOVWF EARGB3
BSF AARGB0,MSB
MOVLW 0xB1
MOVWF BARGB0
MOVLW 0x72
MOVWF BARGB1
MOVLW 0x18
MOVWF BARGB2
CALL FXM2424U
BTFSC AARGB0,MSB
GOTO LOG24DONE
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
LOG24DONE BTFSS EARGB3,MSB
BCF AARGB0,MSB
BTFSS DARGB3,RND
RETLW 0x00
BSF FPFLAGS,RND
GOTO RND3224
;----------------------------------------------------------------------------------------------
; minimax rational coefficients for log2(1+x)/x on [1/sqrt(2)-1,0]
LOG24HP0 EQU 0x81 ; LOG24HP0 = .73551298732E+1
LOG24HP00 EQU 0x6B
LOG24HP01 EQU 0x5D
LOG24HP02 EQU 0x39
LOG24HP1 EQU 0x81 ; LOG24HP1 = .40900513905E+1
LOG24HP10 EQU 0x02
LOG24HP11 EQU 0xE1
LOG24HP12 EQU 0xB3
LOG24HQ0 EQU 0x81 ; LOG24HQ0 = .50982159260E+1
LOG24HQ00 EQU 0x23
LOG24HQ01 EQU 0x24
LOG24HQ02 EQU 0x96
LOG24HQ1 EQU 0x81 ; LOG24HQ1 = .53849258895E+1
LOG24HQ10 EQU 0x2C
LOG24HQ11 EQU 0x51
LOG24HQ12 EQU 0x50
LOG24HQ2 EQU 0x7F ; LOG24HQ2 = 1.0
LOG24HQ20 EQU 0x00
LOG24HQ21 EQU 0x00
LOG24HQ22 EQU 0x00
;----------------------------------------------------------------------------------------------
; minimax rational coefficients for log2(1+x)/x on [0,sqrt(2)-1]
LOG24LP0 EQU 0x82 ; LOG24LP0 = .103115556038E+2
LOG24LP00 EQU 0x24
LOG24LP01 EQU 0xFC
LOG24LP02 EQU 0x22
LOG24LP1 EQU 0x81 ; LOG24LP1 = .457749066375E+1
LOG24LP10 EQU 0x12
LOG24LP11 EQU 0x7A
LOG24LP12 EQU 0xCE
LOG24LQ0 EQU 0x81 ; LOG24LQ0 = .714746549793E+1
LOG24LQ00 EQU 0x64
LOG24LQ01 EQU 0xB8
LOG24LQ02 EQU 0x0A
LOG24LQ1 EQU 0x81 ; LOG24LQ1 = .674551124538E+1
LOG24LQ10 EQU 0x57
LOG24LQ11 EQU 0xDB
LOG24LQ12 EQU 0x3A
LOG24LQ2 EQU 0x7F ; LOG24LQ2 = 1.0
LOG24LQ20 EQU 0x00
LOG24LQ21 EQU 0x00
LOG24LQ22 EQU 0x00
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -