Springen naar inhoud

Verkeerde resultaten van sinh en cosh alsook cosh


  • Log in om te kunnen reageren

#1

Stef31

    Stef31


  • >250 berichten
  • 609 berichten
  • Ervaren gebruiker

Geplaatst op 10 januari 2008 - 08:56

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.

// ===============================================================//
// 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);
}

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.




0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures