📄 floexp10.asm
字号:
;********************FLOEXP10********************
;本程序对标准浮点数求以10为底的指数函数EXP10(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:EXP10(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,3重堆栈。
;说明: 1.用户需自行指定 AARGB4,AARGB5,AARGB7,DEXP,DARGB1,DARGB2,DARGB3
; 2.加载本文件的同时也加载了另外2个文件"FLOTDS.ASM","FLOOR.ASM"
; 故用户在使用这2个子程序时可直接调用,不必重新加载.
IFNDEF FLOEXP101
#DEFINE FLOEXP101
INCLUDE "RND3224.ASM"
INCLUDE "FXM2416U.ASM"
INCLUDE "FLOFLOOR.ASM"
INCLUDE "FLOTDS.ASM"
INCLUDE "MUAD32.ASM"
FLOEXP10
MOVLW 0x64 ; |x| < 2**(-24)/(2*LOG(10))
SUBWF EXP,W
MOVWF DARGB0
BTFSC DARGB0,MSB
GOTO EXP1024ONE ;返回 10**x = 1
BTFSC AARGB0,MSB
GOTO TNEXP1024
TPEXP1024
MOVF AEXP,W
SUBLW MAXLOG1024EXP
BTFSS STATUS,C
GOTO DOMERR24
BTFSS STATUS,Z
GOTO EXP1024ARGOK
MOVF AARGB0,W
SUBLW MAXLOG1024B0
BTFSS STATUS,C
GOTO DOMERR24
BTFSS STATUS,Z
GOTO EXP1024ARGOK
MOVF AARGB1,W
SUBLW MAXLOG1024B1
BTFSS STATUS,C
GOTO DOMERR24
GOTO EXP1024ARGOK
TNEXP1024
MOVF AEXP,W
SUBLW MINLOG1024EXP
BTFSS STATUS,C
GOTO DOMERR24
BTFSS STATUS,Z
GOTO EXP1024ARGOK
MOVF AARGB0,W
SUBLW MINLOG1024B0
BTFSS STATUS,C
GOTO DOMERR24
BTFSS STATUS,Z
GOTO EXP1024ARGOK
MOVF AARGB1,W
SUBLW MINLOG1024B1
BTFSS STATUS,C
GOTO DOMERR24
EXP1024ARGOK
MOVF FPFLAGS,W
MOVWF DARGB3 ; 保存RND位
BCF FPFLAGS,RND ; 屏蔽圆整允许位
CALL RREXP1024
MOVLW 0x7E
SUBWF AEXP,W
BTFSS STATUS,Z
GOTO EXP1024L
EXP1024H BTFSS AARGB0,MSB-1
GOTO EXP1024HL
POL EXP24HH,3,0 ;[.75,1]
MOVF EARGB3,W
ADDWF AEXP,F
RETLW 0x00
EXP1024HL POL EXP24HL,3,0 ;[.5,.75]
MOVF EARGB3,W
ADDWF AEXP,F
RETLW 0x00
EXP1024L MOVLW 0x7D
SUBWF AEXP,W
BTFSS STATUS,Z
GOTO EXP1024LL
POL EXP24LH,3,0 ;[.25,.5]
MOVF EARGB3,W
ADDWF AEXP,F
RETLW 0x00
EXP1024LL POL EXP24LL,3,0 ;[0,.25]
EXP1024OK
MOVF EARGB3,W
ADDWF AEXP,F
BTFSS DARGB3,RND
RETLW 0x00
BSF FPFLAGS,RND ;恢复圆整允许位
GOTO RND3224
EXP1024ONE MOVLW .127 ;返回 e**x = 1.0
MOVWF AEXP
CLRF AARGB0
CLRF AARGB1
CLRF AARGB2
RETLW 0x00
;**********************************************************************************************
; Range reduction routine for the exponential function
; x/log10(2) = z + n
RREXP1024
MOVF AARGB0,W
MOVWF EARGB3
BSF AARGB0,MSB
MOVF AARGB0,W
MOVWF BARGB0
MOVF AARGB1,W
MOVWF BARGB1
MOVLW 0xD4 ; 1/log10(2) = 3.32192809489
MOVWF AARGB0
MOVLW 0x9A
MOVWF AARGB1
MOVLW 0x78
MOVWF AARGB2
CALL FXM2416U ; x * (1/log10(2))
INCF AEXP,F
INCF AEXP,F
BTFSC AARGB0,MSB
GOTO RREXP1024YOK
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
RREXP1024YOK
BTFSS EARGB3,MSB
BCF AARGB0,MSB
MOVF AEXP,W
MOVWF BEXP
MOVF AARGB0,W
MOVWF BARGB0
MOVF AARGB1,W
MOVWF BARGB1
MOVF AARGB2,W
MOVWF BARGB2
CALL FLOFLOOR
MOVF AEXP,W ;n保存在DARG中
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
CALL FLOTDS ;n = [ x * (1/ln2) ]
MOVF AARGB1,W
MOVWF EARGB3 ;定点整数n保存在EARG中
MOVF DEXP,W
MOVWF AEXP
MOVF DARGB0,W
MOVWF AARGB0
MOVF DARGB1,W
MOVWF AARGB1
CLRF AARGB2
MOVLW 0x80
XORWF AARGB0,F
CALL FPA32
MOVF AEXP,W
MOVWF DEXP ;Z保存在 DARG
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
RETLW 0x00
;----------------------------------------------------------------------------------------------
; Maximum argument to EXP1024
MAXLOG1024EXP equ 0x84 ; 38.531839445 = log10(2**128)
MAXLOG1024B0 equ 0x1A
MAXLOG1024B1 equ 0x21
; Minimum argument to EXP1024
MINLOG1024EXP equ 0x84 ; -37.9297794537 = log10(2**-126)
MINLOG1024B0 equ 0x97
MINLOG1024B1 equ 0xB8
; third degree minimax polynomial coefficients for 2**(x) on [.75,1]
EXP24HH0 EQU 0x7E ; EXP24HH0 = .99103284632
EXP24HH00 EQU 0x7D
EXP24HH01 EQU 0xB4
EXP24HH02 EQU 0x54
EXP24HH1 EQU 0x7E ; EXP24HH1 = .73346850266
EXP24HH10 EQU 0x3B
EXP24HH11 EQU 0xC4
EXP24HH12 EQU 0x97
EXP24HH2 EQU 0x7C ; EXP24HH2 = .17374128273
EXP24HH20 EQU 0x31
EXP24HH21 EQU 0xE9
EXP24HH22 EQU 0x3C
EXP24HH3 EQU 0x7B ; EXP24HH3 = .10175678143
EXP24HH30 EQU 0x50
EXP24HH31 EQU 0x65
EXP24HH32 EQU 0xDC
; third degree minimax polynomial coefficients for 2**(x) on [.5,.75]
EXP24HL0 EQU 0x7E ; EXP24HL0 = .99801686089
EXP24HL00 EQU 0x7F
EXP24HL01 EQU 0x7E
EXP24HL02 EQU 0x08
EXP24HL1 EQU 0x7E ; EXP24HL1 = .70586404164
EXP24HL10 EQU 0x34
EXP24HL11 EQU 0xB3
EXP24HL12 EQU 0x81
EXP24HL2 EQU 0x7C ; EXP24HL2 = .21027360637
EXP24HL20 EQU 0x57
EXP24HL21 EQU 0x51
EXP24HL22 EQU 0xF7
EXP24HL3 EQU 0x7B ; EXP24HL3 = .85566912730E-1
EXP24HL30 EQU 0x2F
EXP24HL31 EQU 0x3D
EXP24HL32 EQU 0xB5
; third degree minimax polynomial coefficients for 2**(x) on [.25,.5]
EXP24LH0 EQU 0x7E ; EXP24LH0 = .99979384559
EXP24LH00 EQU 0x7F
EXP24LH01 EQU 0xF2
EXP24LH02 EQU 0x7D
EXP24LH1 EQU 0x7E ; EXP24LH1 = .69545887384
EXP24LH10 EQU 0x32
EXP24LH11 EQU 0x09
EXP24LH12 EQU 0x98
EXP24LH2 EQU 0x7C ; EXP24LH2 = .23078300446
EXP24LH20 EQU 0x6C
EXP24LH21 EQU 0x52
EXP24LH22 EQU 0x61
EXP24LH3 EQU 0x7B ; EXP24LH3 = .71952910179E-1
EXP24LH30 EQU 0x13
EXP24LH31 EQU 0x5C
EXP24LH32 EQU 0x0C
; third degree minimax polynomial coefficients for 2**(x) on [0,.25]
EXP24LL0 EQU 0x7E ; EXP24LL0 = .99999970657
EXP24LL00 EQU 0x7F
EXP24LL01 EQU 0xFF
EXP24LL02 EQU 0xFB
EXP24LL1 EQU 0x7E ; EXP24LL1 = .69318585159
EXP24LL10 EQU 0x31
EXP24LL11 EQU 0x74
EXP24LL12 EQU 0xA1
EXP24LL2 EQU 0x7C ; EXP24LL2 = .23944330933
EXP24LL20 EQU 0x75
EXP24LL21 EQU 0x30
EXP24LL22 EQU 0xA0
EXP24LL3 EQU 0x7A ; EXP24LL3 = .60504944237E-1
EXP24LL30 EQU 0x77
EXP24LL31 EQU 0xD4
EXP24LL32 EQU 0x08
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -