Hallo Leute,
ich bräuchte sehr die Hilfe von jemandem, der sich mit der FPU auskennt. Denn ich bin erst kurz dabei, was den Koprozessor betrifft...
Gestern habe ich versucht, eine Art pow für double Werte zu implementieren. Zuerst dachte ich, die FPU würde sowieso einen ähnlichen Befehl bereitstellen, aber als ich den nicht gefunden hab, war ich mir sicher, dass ich über die Befehle fyl2x und f2xm1 zum Ziel kommen würde. Nämlich über die einfache Umformung, dass a^b = 2 ^ (b * log2(a)) ist.
Ich habe folgende Funktion:
public _bbFloatPow
_bbFloatPow:
fld qword [esp+12] ; power
fld qword [esp+4] ; base
fyl2x ; power * log2(base)
f2xm1 ; 2^(power*log2(base))-1
fld1
faddp ; 2^(power*log2(base))
ret
und für kleine Werte kommen richtige ergebnisse heraus: pow(1, 2) = 1; pow(sqrt(2), 2) = 2; pow(4, 0.5) = 2
aber pow(2,2) = 3 und pow(8, 2) = 7 ... die Ungenauigkeiten beginnen über 2 oder so...
Weiß jemand woran das liegt und kann mir helfen, diese Fehler zu beheben?