Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
10. Sep 2006
Normalerweise hätte ich das mit Assembler gemacht, aber ich kenne mich dafür noch nicht gut genug mit der FPU aus.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
9. Sep 2006
Das sehe ich anders. Bei so grundlegenden, also so eigentlich primitiven Funktionen jedenfalls. Bei einer sehr speziellen Funktion, die selten aufgerufen wird, kann das wieder anders aussehen. Aber wenn mein Code oft wiederverwendet wird, optimiere ich ihn lieber.
Und so ein if kann den Prozessor nunmal ordentlich ausbremsen, daher vermeide ich es nunmal gerne.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
9. Sep 2006
Das geht schneller:
function signmultiply(const a, b: Extended): Extended;
begin
result:=a;
PByte(Integer(@result)+9)^:=PByte(Integer(@result)+9)^ xor
(PByte(Integer(@b)+9)^ and (1 shl 7));
end;
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Meins geht auch ohne großartige Typendeklarationen. :P
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Halt, ich hab mir deins nochmal angeschaut - das dürfte tatsächlich noch schneller sein.
Deine Lösung funktioniert bei mir nicht. Little Endian Format? Und ich würde es so machen:
function Sign(e: Extended): Integer;
begin
result:=0-(PByte(Integer(@e)+9)^ shr 7) or 1;
end;
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Da dürfte Hawkeyes Lösung noch schneller sein.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Er kann ihn ja vorher truncaten.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Sondern? Natürlich, ich bekomme nicht - oder +, aber -1 oder +1. Das ist auch alles, was ich will. Ich brauch den Befehl "hänge an a das Vorzeichen von b dran" und dafür schreib ich dann
a := sign(b)*a;
Wie lässt sich das if denn in der Funktion verhindern (ohne Assembler-Code)? Mehr als
result := value/abs(value)
fällt mir nicht ein. Aber das soll ja noch langsamer sein, als ein if.
Wie...
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Ganz einfach: Wenn er eine 0 oder eine 1 reinkriegt, hat er eine 0 als Ergebnis. Das muss aber eine 1 sein, darum or 1.
@Cöster: Eigentlich hätte ich schreiben sollen eine logisch-arithmetische Operation. Dazu gehören +-*/, div und mod und außerdem not, and, or, xor, shl, shr, sar und vllt hab ich noch welche Vergessen.
Auf Assemblerebene gibts noch ein paar zusätzliche wie z.B. cdq, was...
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
@Flocke: Das weiß ich. Aber ich verwende nur ein if anstatt von zwei, was das ganze wieder beschleuningt.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Er sagte, es kommt nie dazu.
Und @Cöster: Nimm nie ein if, wenn du stattdessen eine arithmethische Operation kriegst. Ifs bremsen den Prozessor ab.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Das funktioniert so nicht ganz.
Denn bei 0 hast du eine 0 im Sign-Bit und dann kriegst du bei einer 0 als Result 1.
Und wenn du das willst, geht das auch genausogut so:
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
So hat er das nicht gemeint. Er wollte eine Integer-Wert. Außerdem hast du eine unnötige Zuweisung drin und die 0 hat kein Vorzeichen, auch kein positives. ;)
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Einfach Math importieren.
@Jason: Das geht nicht, wenn du ne 0 reinbekommst.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
8. Sep 2006
Dafür gibts die Funktion Sign()