Ik heb de volgende functies geschreven in assembly voor het berekenen van de SinHyperbolicus, CosinusHyperbolicus en TangensHyperBolicus.
Als ik die functies uitvoert en getallen invoer en dit vergelijkt met MathCad waar ik hetzelfde doe dan krijg ik zeer rare resultaten dus denk ik toch eens mijn code te posten, wiskundig is het juist maar is het dan ook wel technisch juist, heb ik iets niet over het hoofd gezien, misschien iets overschreven want ik weet het niet
Hierbij stuur ik mijn assembly en wil graag dat eens iemand daar naar kijkt als die code kan correct werken en mij daarbij helpen wat er verkeerd gaat.
Code: Selecteer alles
// ===============================================================//
// Calculate the SinH(x) = (exp(x) / 2) - (exp(-x) / 2)
//
// Use the FPU functions:
//
// F2XM1 : calculate 2 ^ x - 1
//
// FLDL2E : constant : Log2(Exp(x))
//
// ===============================================================//
extern double SinH(double x)
{
double temp = 1.0;
_asm
{
FLD x
; load the variabele x on the ST(0) = x
FST ST(1) ; store result x on the stack ST(1) = x
F2XM1
; calculate 2^x - 1
; value of x on the TOS ST(0) = x
; F2XM1 = result
FLD1
; load 1
FADD
; ST(0) := 1 + 2^x - 1
FST ST(2) ; store the result in ST(2) := x ^ 2
FLDL2E
; load LOG2(e) on the stack
FLD1
; load 1.0 on the TOS ST(0) := 1.0
FSUB
; calculate the subtract ST(0) := -x
FLD ST(2) ; load x ^ 2 on the stack ST(0) := x ^ 2
FMUL
; multiply
F2XM1
; load Log2(exp(x)) on the TOS ST := Log2(exp(x))
FLD1
; ST(0) := +1.0 en ST(1) := Log2(exp(x))
FADD
; ST(0) := 1 + Log2(Exp(x))
FLD ST(1) ; ST(1) := ST(0)
FMUL
; ST(0) = 2 ^ x * 2 ^ (Log2(Exp(x) * x))
FST ST(1) ; ST(1) = ST(0)
FLD1
; ST(0) = +1.0
FDIVR
; ST(0) = 1 / (2 ^ x * 2 ^(Log2(Exp(x) * x))
FLD ST(1) ; ST(1) = +1.0
FSUBR
; ST = ST - ST(1) 1.0 - 1 / (2 ^ x * 2 ^(Log2(Exp(x) * x))
FSTP ST(1) ; ST(1) := ST(0)
FLD1
; ST(0) := +1.0
FLD1
; ST(0) := +1.0
FADD
; ST(0) := 2
FLD ST(1) ;
FDIVR
;
FST temp ;
FNINIT
;
}
return(temp);
}
// ===============================================================//
// Calculate the CosH(x) = (exp(x) / 2) - (exp(-x) / 2)
//
// Use the FPU functions:
//
// F2XM1 : calculate 2 ^ x - 1
//
// FLDL2E : constant : Log2(Exp(x))
//
// ===============================================================//
extern double CosH(double x)
{
double temp = 1.0;
_asm
{
FLD x
FST ST(1) ;ST(1) = x
F2XM1
FLD1
FADD
FST ST(2) ;ST(2) = x ^ 2
FLDL2E
FLD1
FSUB
FLD ST(2)
FMUL
F2XM1
FLD1
FADD
FLD ST(1)
FMUL
;ST(0) 2 ^ x * 2 ^(0.44 * x)
FST ST(1)
FLD1
FDIVR
;ST(0) = 1 / (2 ^ x * 2 ^(0.44 * x))
FLD ST(1)
FADD
FSTP ST(1)
FLD1
FLD1
FADD
FLD ST(1)
FDIVR
FST temp
FNINIT
}
return(temp);
}
extern double TanH(double x)
{
double MCX = 0.0;
double MSX = 0.0;
double temp = 0.0;
// double result = Deg2Rad(x);
MCX = CosH(x);
MSX = SinH(x);
_asm
{
FLD MCX
; load MCX := CosH(x) => ST(0)
FLD MSX
; load MSX := SinH(x) => ST(1)
FDIVR
; ST(0) := SinH(x) / CosH(x)
FST temp
; mem[temp] := SinH(x) / CosH(x)
FNINIT
; init FPU registers
}
return(temp);
}