Verkeerde resultaten van sinh en cosh alsook cosh

Moderators: jkien, Xilvo

Reageer
Berichten: 609

Verkeerde resultaten van sinh en cosh alsook cosh

Hallo Rogier en andere assembly programmeurs

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);

}

Reageer