| Die in der VisualBasic Hilfe und vielen Webseiten angegebenen Formeln zur Berechnung der Funktionen ArcSec ArcCsc ArcCot sind falsch, und andere sind mathematisch schlecht gelöst.
;===============================================================================
;===============================================================================
;===============================================================================
;-------------------------------------------------------------------------------
;===============================================================================
comment * ----------------------------------------------------------------------
Infos:
-------
------------------------------------------------------------------------------ *
;Funktionen:
;
;Sinus Sin(X)
;Cosinus Cos(X)
;Tangens Tan(X)
;
;SinusCosinus SinCos(X, Y) = Sin(X), Cos(Y)
;
;Sekans Sec(X) = 1 / Cos(X)
;Kosekans Csc(X) = 1 / Sin(X)
;Kotangens Cot(X) = 1 / Tan(X)
;
;Arkus Sinus ASin(X) = ATan(X / Sqr(1 - (X ^ 2)))
;Arkus Kosinus ACos(X) = ATan(Sqr(1 - (X ^ 2)) / X)
;Arkus Tangens ATan(X) = ATan(X)
;
;Arkus Sekans ASec(X) = ATan(Sqr((X ^ 2) - 1))
;Arkus Kosekans ACsc(X) = ATan(1 / Sqr((X ^ 2) - 1))
;Arkus Kotangens ACot(X) = ATan(1 / X)
;
;Hyperb. Sinus SinH(X) = (Exp(X) - Exp(-X)) / 2
;Hyperb. Kosinus CosH(X) = (Exp(X) + Exp(-X)) / 2
;Hyperb. Tangens TanH(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))
;
;Hyperb. Sekans SecH(X) = 2 / (Exp(X) + Exp(-X))
;Hyperb. Kosekans CscH(X) = 2 / (Exp(X) - Exp(-X))
;Hyperb. Kotangens CotH(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))
;
;Hyperb. Arkus Sinus ASinH(X) = Log(X + Sqr((X ^ 2) + 1))
;Hyperb. Arkus Kosinus ACosH(X) = Log(X + Sqr((X ^ 2) - 1))
;Hyperb. Arkus Tangens ATanH(X) = Log((1 + X) / (1 - X)) / 2
;
;Hyperb. Arkus Sekans ASecH(X) = Log((Sqr((X ^ 2) - 1) + 1) / X)
;Hyperb. Arkus Kosekans ACscH(X) = Log((Sgn(X) * Sqr((X ^ 2) + 1) + 1) / X)
;Hyperb. Arkus Kotangens ACotH(X) = Log((X + 1) / (X - 1)) / 2
;
;Logarithmus zur Basis N LogN(X, N) = Log(X) / Log(N)
;FLDL2E ;1.44270
;FLDL2T ;3.32193
;FLDLN2 ;0.69315
;FLDLG2 ;0.30103
;-------------------------------------------------------------------------------
;===============================================================================
;===============================================================================
;======= Code-Deklaration
;-------------------------------------------------------------------------------
.386 ; Minimal Anforderung an Prozessor
;.486 ; Minimal Anforderung an Prozessor
;.586 ; Minimal Anforderung an Prozessor
;.model flat, stdcall ; Flat-Memory Modell 32Bit
option casemap :none ; Case-Sensitive
;===============================================================================
;======= Includes von Externen Prozessen und APIs
;-------------------------------------------------------------------------------
;===============================================================================
;======= Public-Deklaration von Prozessen die Extern sichtbar sind
;-------------------------------------------------------------------------------
;===============================================================================
;======= Daten-Deklarationen
;-------------------------------------------------------------------------------
.data ; Daten-Block Beginn
;===============================================================================
;===============================================================================
;===============================================================================
;======= Code-Beginn
;-------------------------------------------------------------------------------
.code ; Code-Block Begin
;===============================================================================
;======= Proceduren für den Code
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;Sin Cos Tan
Test_FpuTrig_Sin PROC Public Val1:TBYTE
;=== Sinus
;=== ST0 = Sin(Val1)
FLD Val1 ; -> ST0 = Val1
FSIN ; -- ST0 = Sin(Val1)
FWAIT
RET
Test_FpuTrig_Sin ENDP
Test_FpuTrig_Cos PROC Public Val1:TBYTE
;=== CoSinus
;=== ST0 = Cos(Val1)
FLD Val1 ; -> ST0 = Val1
FCOS ; -- ST0 = Cos(Val1)
FWAIT
RET
Test_FpuTrig_Cos ENDP
Test_FpuTrig_Tan PROC Public Val1:TBYTE
;=== Tangens
;=== ST0 = Tan(Val1)
FLD Val1 ; -> ST0 = Val1
FPTAN ; -> ST0 = 1 , ST1 = Tan(Val1) ACHTUNG: das Resultat steht in ST1 nicht ST0
FSTP ST(0) ; <- ST0 = ST1
FWAIT
RET
Test_FpuTrig_Tan ENDP
Test_FpuTrig_SinCos PROC Public Val1:TBYTE
;=== Sinus, CoSinus
;=== ST0 = Cos(Val1) , ST1 = Sin(Val1)
FLD Val1 ; -> ST0 = Val1
FSINCOS ; -> ST0 = Cos(Val1) , ST1 = Sin(Val1)
FWAIT
RET
Test_FpuTrig_SinCos ENDP
;-------------------------------------------------------------------------------
;Sek Csc Cot
Test_FpuTrig_Sec PROC Public Val1:TBYTE
;=== Sekans
;=== ST0 = 1 / Cos(Val1)
FLD Val1 ; -> ST0 = Val1
FCOS ; -- ST0 = Cos(Val1)
FLD1 ; -> ST0 = 1 , ST1=Cos(Val1)
FDIVRP ST(1), ST ; <- ST0 = ST0 / ST1
;FIXME Sec = 1 / Cos -> Cos(Val1) <> 0!
FWAIT
RET
Test_FpuTrig_Sec ENDP
Test_FpuTrig_Csc PROC Public Val1:TBYTE
;=== CoSekans
;=== ST0 = 1 / Sin(Val1)
FLD Val1 ; -> ST0 = Val1
FSIN ; -- ST0 = Sin(Val1)
FLD1 ; -> ST0 = 1 , ST1=Sin(Val1)
FDIVRP ST(1), ST ; <- ST0 = ST0 / ST1
FWAIT
RET
Test_FpuTrig_Csc ENDP
Test_FpuTrig_Cot PROC Public Val1:TBYTE
;=== CoTangens
;=== ST0 = 1 / Tan(Val1)
FLD Val1 ; -> ST0 = Val1, ST1=1
FPTAN ; -> ST0 = 1 , ST1 = Tan(Val1) ACHTUNG: das Resultat Tan() steht in ST1, nicht ST0
FDIVRP ST(1), ST ; <- ST0 = ST0 / ST1
;FIXME Geschwindigkeits-Check
;FSINCOS
;FDIVRP ST(1), ST ; <- ST0 = ST0 / ST1
FWAIT
RET
Test_FpuTrig_Cot ENDP
;-------------------------------------------------------------------------------
;Transcendental
;ASin ACos ATan
Test_FpuTrig_ArcSin PROC Public Val1:TBYTE
;=== Arkus-Sinus
;=== ST0 = ATan(Val1 / Sqr(1 - (Val1 ^ 2)))
FLD Val1 ; -> ST0 = Val1
FLD ST(0) ; -> ST0 = Val1, ST1=Val1
FMUL ST, ST(0) ; -- ST0 = Val1 * Val1 , ST1=Val1 [X ^ 2]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1 , ST2=Val1
FSUBRP ST(1), ST ; <- ST0 = ST0 - ST1 , ST1=Val1 [1 - X ^ 2]
FSQRT ; -- ST0 = SQR(ST0) , ST1=Val1 [Sqr(1 - X ^ 2)]
FPATAN ; <- ST0 = ATan(ST1 / ST0) [ATan(Val1 / Sqr(1 - (Val1 ^ 2)))]
FWAIT
RET
Test_FpuTrig_ArcSin ENDP
Test_FpuTrig_ArcCos PROC Public Val1:TBYTE
;=== Arkus-CoSinus
;=== ST0 = ATan(Sqr(1 - (Val1 ^ 2)) / Val1)
FLD Val1 ; -> ST0 = Val1
FLD ST(0) ; -> ST0 = Val1, ST1=Val1
FMUL ST, ST(0) ; -- ST0 = Val1 * Val1 , ST1=Val1 [X * X]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1 , ST2=Val1
FSUBRP ST(1), ST ; <- ST0 = ST0 - ST1 , ST2=Val1 [1 - X * X]
FSQRT ; -- ST0 = SQR(ST0) , ST1=Val1
FXCH ; -- ST0 <=> ST1
FPATAN ; <- ST0 = ATan(ST1 / ST0)
FWAIT
RET
Test_FpuTrig_ArcCos ENDP
Test_FpuTrig_ArcTan PROC Public Val1:TBYTE
;=== Arcus-Tangens
;=== ST0 = ATAN(Val1)
FLD Val1 ; -> ST0 = Val1
FLD1 ; -> ST0 = 1 , ST1 = Val1
FPATAN ; <- ST0 = ATAN(ST1 / ST0)
FWAIT
RET
Test_FpuTrig_ArcTan ENDP
Test_FpuTrig_ArcTan2 PROC Public Val1:TBYTE, Val2:TBYTE
;=== Arcus-Tangens-XY
;=== ST0 = ATan(Val2 / Val1)
FLD Val2 ; -> ST0 = Val2
FLD Val1 ; -> ST0 = Val1 , ST1=Val2
FPATAN ; <- ST0 = ATAN(ST1 / ST0)
FWAIT
RET
Test_FpuTrig_ArcTan2 ENDP
;-------------------------------------------------------------------------------
;ASek ACsc ACot
Test_FpuTrig_ArcSec PROC Public Val1:TBYTE
;=== Arkus-Sekans
;=== ST0 = ArcTan(Sqr((Val1 ^ 2) - 1))
FLD Val1 ; -> ST0 = Val1
FMUL ST, ST(0) ; -- ST0 = Val1 [Val1 ^ 2]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1
FSUBP ST(1), ST ; <- ST0 = ST1 - ST0 [Val1 ^ 2 - 1]
FSQRT ; -- ST0 = SQR(ST0) [Sqr((Val1 ^ 2) - 1)]
FLD1 ; -> ST0 = 1 , ST1=ST1
FPATAN ; <- ST0 = ATan(ST1 / ST0)
FWAIT
RET
Test_FpuTrig_ArcSec ENDP
Test_FpuTrig_ArcCsc PROC Public Val1:TBYTE
;=== Arkus-KoSekans
;=== ST0 = ArcTan(Sqr((1 / (Val1 ^ 2)) - 1))
FLD Val1 ; -> ST0 = Val1
FMUL ST, ST(0) ; -- ST0 = Val1 [Val1 ^ 2]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1
FSUBP ST(1), ST ; <- ST0 = ST1 - ST0 [Val1 ^ 2 - 1]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1
FDIVRP ST(1), ST ; <- ST0 = ST1 / ST0
FSQRT ; -- ST0 = SQR(ST0) [Sqr((1 / (Val1 ^ 2)) - 1)]
FLD1 ; -> ST0 = 1 , ST1=ST1
FPATAN ; <- ST0 = ATan(ST1 / ST0)
FWAIT
RET
Test_FpuTrig_ArcCsc ENDP
Test_FpuTrig_ArcCot PROC Public Val1:TBYTE
;=== Arkus-KoTangens
;=== ST0 = ArcTan(1 / Val1)
FLD Val1 ; -> ST0 = Val1
FLD1 ; -> ST0 = 1 , ST1 = Val1
FXCH ; -- ST0 <=> ST1
FPATAN ; <- ST0 = ATAN(ST1 / ST0)
FWAIT
RET
Test_FpuTrig_ArcCot ENDP
;-------------------------------------------------------------------------------
;Hyperbolic
;SinH CosH TanH
Test_FpuTrig_HypSin PROC Public Val1:TBYTE
;=== Sinus-Hyperberbolikus
;=== ST0 = (Exp(X) - Exp(-X)) / 2
FLD Val1 ; -> ST0 = Val1
;- Exp(X)
FLDL2E
FMULP ST(1), ST
FSTCW ControlWW
FLDCW RoundDown
FLD ST(0)
FRNDINT
FLDCW ControlWW ;[EBP-8]
FXCH
FSUB ST, ST(1)
F2XM1
FLD1
FADDP ST(1), ST
FSCALE
;-
FST ST(1)
FLD1
FDIVRP ST(1), ST
FSUBP ST(1), ST ; -
;FLD OneHalf ;Variante 1
;FMULP ST(1), ST
FIDIV ValInt_2 ;Variante 2
;FLD1 ;Variante 3
;FADD ST, ST(0)
;FDIVP ST(1), ST
comment *
sinh:
FYL2X
FLD ST(0)
FRNDINT
FSUB ST(1), ST(0)
FLD1
FSCALE
FXCH
FXCH ST(2)
F2XM1
FLD1
FADDP ST(1), ST(0)
FMULP ST(1), ST(0)
FSTP ST(1)
FLD ST(0)
FLD1
FDIVRP ST(1),ST(0)
FSUBP ST(1),ST(0) ; -
FLD TWORD [RX_HALF]
FMULP ST(1),ST(0)
*
FWAIT
RET
Test_FpuTrig_HypSin ENDP
Test_FpuTrig_HypCos PROC Public Val1:TBYTE
;=== KoSinus-Hyperberbolikus ;
;=== ST(0) = (Exp(X) + Exp(-X)) / 2
FLD Val1 ; -> ST(0) = Val1
;- Exp(X)
FLDL2E
FMULP ST(1), ST
FSTCW ControlWW
FLDCW RoundDown
FLD ST(0)
FRNDINT
FLDCW ControlWW ;[EBP-8]
FXCH
FSUB ST, ST(1)
F2XM1
FLD1
FADDP ST(1), ST
FSCALE
;-
FST ST(1)
FLD1
FDIVRP ST(1), ST
FADDP ST(1), ST ; +
;FLD OneHalf
;FMULP ST(1), ST
FIDIV ValInt_2
;FLD1
;FADD ST, ST(0)
;FDIVP ST(1), ST
comment *
cosh:
FYL2X
FLD ST(0)
FRNDINT
FSUB ST(1), ST(0)
FLD1
FSCALE
FXCH
FXCH ST(2)
F2XM1
FLD1
FADDP ST(1), ST(0)
FMULP ST(1), ST(0)
FSTP ST(1)
FLD ST(0)
FLD1
FDIVRP ST(1),ST(0)
FADDP ST(1),ST(0) ; +
FLD TWORD [RX_HALF]
FMULP ST(1),ST(0)
*
FWAIT
RET
Test_FpuTrig_HypCos ENDP
Test_FpuTrig_HypTan PROC Public Val1:TBYTE
;=== Tangens-Hyperberbolikus ;
;=== ST(0) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))
FLD Val1 ; -> ST(0) = Val1
;- Exp(X)
FLDL2E
FMULP ST(1), ST
FSTCW ControlWW
FLDCW RoundDown
FLD ST(0)
FRNDINT
FLDCW ControlWW ;[EBP-8]
FXCH
FSUB ST, ST(1)
F2XM1
FLD1
FADDP ST(1), ST
FSCALE
;-
FST ST(1)
FMUL ST(0),ST(0)
FLD ST(0)
FLD1
FADDP ST(1),ST(0)
FXCH
FLD1
FSUBP ST(1),ST(0)
FDIVRP ST(1),ST(0)
comment *
;- cosh
FST ST(1)
FLD1
FDIVRP ST(1), ST
FADDP ST(1), ST ; +
FIDIV ValInt_2
cosh:
FLD ST(0)
FLD1
FDIVRP ST(1),ST(0)
FADDP ST(1),ST(0) ; - +
FIDIV ValInt_2
tanh:
FMUL ST(0),ST(0)
FLD ST(0)
FLD1
FADDP ST(1),ST(0)
FXCH
FLD1
FSUBP ST(1),ST(0)
FDIVRP ST(1),ST(0)
*
comment *
tanh:
FYL2X
FLD ST(0)
FRNDINT
FSUB ST(1), ST(0)
FLD1
FSCALE
FXCH
FXCH ST(2)
F2XM1
FLD1
FADDP ST(1), ST(0)
FMULP ST(1), ST(0)
FSTP ST(1)
FMUL ST(0),ST(0)
FLD ST(0)
FLD1
FADDP ST(1),ST(0)
FXCH
FLD1
FSUBP ST(1),ST(0)
FDIVRP ST(1),ST(0)
cosh:
FLD ST(0)
FLD1
FDIVRP ST(1),ST(0)
FADDP ST(1),ST(0) ; +
FLD TWORD [RX_HALF]
FMULP ST(1),ST(0)
tanh:
FMUL ST(0),ST(0)
FLD ST(0)
FLD1
FADDP ST(1),ST(0)
FXCH
FLD1
FSUBP ST(1),ST(0)
FDIVRP ST(1),ST(0)
*
FWAIT
RET
Test_FpuTrig_HypTan ENDP
;-------------------------------------------------------------------------------
;SekH CscH CotH
Test_FpuTrig_HypSec PROC Public Val1:TBYTE
;=== Sekans-Hyperberbolikus ;
;=== ST0 = 2 / (Exp(X) + Exp(-X))
FLD Val1 ; -> ST0 = Val1
;WRITEME
FSTP ST(0)
FLDZ
FWAIT
RET
Test_FpuTrig_HypSec ENDP
Test_FpuTrig_HypCsc PROC Public Val1:TBYTE
;=== KoSekans-Hyperberbolikus ;
;=== ST0 = 2 / (Exp(X) - Exp(-X))
FLD Val1 ; -> ST0 = Val1
;WRITEME
FSTP ST(0)
FLDZ
FWAIT
RET
Test_FpuTrig_HypCsc ENDP
Test_FpuTrig_HypCot PROC Public Val1:TBYTE
;=== KoTangens-Hyperberbolikus
;=== ST0 = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))
FLD Val1 ; -> ST0 = Val1
;WRITEME
FSTP ST(0)
FLDZ
FWAIT
RET
Test_FpuTrig_HypCot ENDP
;-------------------------------------------------------------------------------
;Arcus Hyperbolic
;ASinH ACosH ATanH
Test_FpuTrig_HypArcSin PROC Public Val1:TBYTE
;=== Arkus-Sinus-Hyperberbolikus
;=== ST0 = Log(Val1 + Sqr(Val1 ^ 2 + 1))
;FLDLN2
FLD Val1 ; -> ST0 = Val1
FLD ST(0) ; -> ST0 = Val1, ST1=Val1
FMUL ST, ST(0) ; -- ST0 = Val1 * Val1 , ST1=Val1 [X ^ 2]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1 , ST2=Val1
FADDP ST(1), ST ; <- ST0 = ST1 + ST0 , ST1=Val1 [X ^ 2 + 1]
FSQRT ; -- ST0 = SQR(ST0) , ST1=Val1 [Sqr(X ^ 2 + 1))]
FADDP ST(1), ST ; <- ST0 = ST1 + ST0 [X + Sqr(X ^ 2 + 1)]
FLDLN2 ; -> ST0 = LogE(2) , ST1=ST0
FXCH ; -- ST0 <=> ST1
FYL2X ; <- ST0 = Log2(ST0) * ST1(FLDLN2) [Log(X + Sqr(X ^ 2 + 1))]
FWAIT
RET
Test_FpuTrig_HypArcSin ENDP
Test_FpuTrig_HypArcCos PROC Public Val1:TBYTE
;=== Arkus-KoSinus-Hyperberbolikus
;=== ST0 = Log(Val1 + Sqr((Val1 ^ 2) - 1))
;FLDLN2
FLD Val1 ; -> ST0 = Val1
FLD ST(0) ; -> ST0 = Val1, ST1=Val1
FMUL ST, ST(0) ; -- ST0 = Val1 * Val1 , ST1=Val1 [X ^ 2]
FLD1 ; -> ST0 = 1 , ST1=Val1*Val1 , ST2=Val1
FSUBP ST(1), ST ; <- ST0 = ST1 + ST0 , ST1=Val1 [X ^ 2 - 1]
FSQRT ; -- ST0 = SQR(ST0) , ST1=Val1 [Sqr(X ^ 2 + 1))]
FADDP ST(1), ST ; <- ST0 = ST1 + ST0 [X + Sqr(X ^ 2 + 1)]
FLDLN2 ; -> ST0 = LogE(2) , ST1=ST0
FXCH ; -- ST0 <=> ST1
FYL2X ; <- ST0 = Log2(ST0) * ST1(FLDLN2) [Log(X + Sqr(X ^ 2 + 1))]
FWAIT
RET
Test_FpuTrig_HypArcCos ENDP
Test_FpuTrig_HypArcTan PROC Public Val1:TBYTE
;=== Arkus-Tangens-Hyperberbolikus
;=== ST0 = Log((1 + Val1) / (1 - Val1)) / 2
;FLDLN2
FLD Val1 ; -> ST0 = Val1
FLD ST(0) ; -> ST0 = Val1, ST1=Val1
FLD1 ; -> ST0 = 1 , ST1=Val1 , ST2=Val1
FADD ST(2), ST ; -- ST0=1 , ST1=Val1 , ST2 = Val1 + 1
FSUBRP ST(1), ST ; <- ST1 = 1 - Val1 , ST2=Val1 + 1
;...
FDIVP ST(1), ST ; <- ST0 = (Val1 + 1) / (1 - Val1)
FLDLN2 ; -> ST0 = LogE(2) , ST1=ST0
FXCH ; -- ST0 <=> ST1
FYL2X ; <- ST0 = Log2(ST0) * ST1[FLDLN2]
FLD1 ; -> ST0 = 1 , ST1=Log((1 + Val1) / (1 - Val1))
FADD ST, ST(0) ; -> ST0 = ST0 + 1 , ST1=ST1
FDIVP ST(1), ST ; <- ST0 = Log((1 + Val1) / (1 - Val1)) / 2
;... Geschwindigkeits-Check
;FDIVP ST(1), ST
;
;FSQRT
;FYL2X
FWAIT
RET
Test_FpuTrig_HypArcTan ENDP
;-------------------------------------------------------------------------------
;ASekH ACscH ACotH
Test_FpuTrig_HypArcSec PROC Public Val1:TBYTE
;=== Arkus-Sekans-Hyperberbolikus
;=== ST0 = Log((Sqr(1 - (Val1 ^ 2)) + 1) / Val1)
FLD Val1 ; -> ST0 = Val1
;WRITEME
FSTP ST(0)
FLDZ
FWAIT
RET
Test_FpuTrig_HypArcSec ENDP
Test_FpuTrig_HypArcCsc PROC Public Val1:TBYTE
;=== Arkus-KoSekans-Hyperberbolikus
;=== ST0 = Log((Sgn(Val1) * Sqr(Val1 ^ 2 + 1) + 1) / Val1)
FLD Val1 ; -> ST0 = Val1
;WRITEME
FSTP ST(0)
FLDZ
FWAIT
RET
Test_FpuTrig_HypArcCsc ENDP
Test_FpuTrig_HypArcCot PROC Public Val1:TBYTE
;=== Arkus-KoTangens-Hyperberbolikus
;=== ST0 = Log((Val1 + 1) / (Val1 - 1)) / 2
FLD Val1 ; -> ST0 = Val1
;WRITEME
FSTP ST(0)
FLDZ
FWAIT
RET
Test_FpuTrig_HypArcCot ENDP
;-------------------------------------------------------------------------------
;===============================================================================
;=============================================================================== |