Zitat von
sirius:
Wo hast du denn das her?
Aus einer
Unit namens "Mathe" oder so
? Turbo Delphi, sollte sich das etwas geändert haben.
Zitat:
Das ist doch viel kürzer (obs schneller ist, weis ich nicht):
Delphi-Quellcode:
function power(x,y:extended):extended;
asm
FLD TBYTE ptr y
FLD TBYTE ptr x
FYL2X
Stimmt, das FLD1 und FMULP hätte ich mir an dieser Stelle sparen und FYL2X (ich liebe diesen Namen) gleich mit x und y füttern können. Mathematik nach 10 Uhr eben
. Mit diesen zwei Zeilen weniger wären wir schon bei 4% Vorsprung gegenüber dem Original
.
Zitat:
Es basiert eben direkt auf 2^(y*lb(x)). Jetzt ist die Frage, wie lange FYL2X, F2XM1 und FSCALE brauchen.
Es sollte aber schneller sein als exp(y*ln(x)) direkt aus der
Unit math.
Jupp, auf
Asm-Ebene wird das sicherlich stimmen. Aber im jenem anderen Thread suchten wir ja nach einem möglichst kurzen Power-Hochsprachen-Ersatz ohne Math-
Unit. Denn sobald ich dort ein wenig mehr optimieren will, klaue ich doch gleich den Power-Code (nächste Wortspiel
) aus Math mit seinen weiteren Optimierungen (hätte nicht gedacht, dass Power wirklich eine Schleife benutzt).
Zitat:
Zu Frage I:
Schau dir mal an wozu das P hinter FMUL da ist
Zitat:
Multiply ST(i) by ST(0), store result in ST(i), and pop the register stack
Soll heißen, es passiert folgendes:
Delphi-Quellcode:
// ST0, ST1
// a, b
fxch
// b, a
fmulp st(1), st
// b, b * a
// pop ->
// b * a,
Ohne fxch gelange ich am Ende zu ST0 = a * b, wo ist also der Unterschied
?