Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Extended to double / real


>M@steR< - So 20.02.11 23:52
Titel: Extended to double / real
Gelöscht


der organist - So 20.02.11 23:59

Hei am frühen Abend oder Freunde der Nacht,

a. imho musst du da nichts umwandeln, oder gibt er dir da ne Fehlermeldung raus? Ist doch beides Gleitkomma...
b. abs gibt dir die Betrag zurück? Dann kannst du dir das schenken, da du ja schon quadrierst. Vermute mal, du willst die Länge des Vektors bestimmen, da brauchst du nur das quadrieren...

Gruss, Lukas


>M@steR< - Mo 21.02.11 00:09

Gelöscht


jaenicke - Mo 21.02.11 00:14

Einen solchen Fehler vermute ich eher bei einer Division oder so, aber an der Stelle hast du auch einen ziemoichen Fehler drin: Du vergleichst einen Gleitkommawert direkt auf Null, das kann nur schiefgehen...

Dafür gibt es extra die Funktion IsZero in der Unit Math, die eine Rundungstoleranz zulässt. Denn durch die interne Verarbeitung im Dualsystem gibt es eben Rundungsfehler, so dass die Variable vielleicht nur fast Null ist.


>M@steR< - Mo 21.02.11 00:22

Gelöscht


jaenicke - Mo 21.02.11 06:36

Vielleicht sind die Zahlen einfach zu groß, z.B. weil da etwas nicht initialisiert ist.

Nebenbei: Statt Power geht hier auch:

Delphi-Quelltext
1:
  Result := Sqrt(Sqr(Vector.X) + Sqr(Vector.Y));                    


>M@steR< - Mo 21.02.11 15:53

Gelöscht


Tranx - Mo 21.02.11 19:03

Neben der Frage, wo der Fehler ist, ist gleich eine andere Frage:

Welche der folgenden Konstrukte ist eigentlich schneller in der Ausführung, oder sind beide gleich schnell:



Delphi-Quelltext
1:
2:
  l := sqrt(sqr(x))+sqr(y)); // Variante 1
  l := sqrt(x*x + y*y); // Variante 2


Hat das schon mal jemand getestet?

//Edit:

Also ich habe mal geprüft:
100.000.000 Operationen:

x, y sind Variante 1 Variante 2

single 1,26 s 1,26 s
double 1.26 s 1.26 s
extended 1.26 s 1.26 s
real 1.26 s 1.26 s

bei Addition eines bestimmten Wertes nach jeder Berechnung zu x und y, um andere Berechnungen zu bekommen, kommt exakt das gleiche Ergebnis heraus. Die Dauer von 100.000.000 Additionen ist nicht messbar.


BenBE - Mo 21.02.11 19:17

Keines von beiden:

Ich zitiere mal kurz etwas Quelltext aus den Omorphia-Sources:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Function Vector2DAbs(Const V: TVector2D): Extended;
{$IFDEF OMORPHIA_FEATURES_USEASM} Assembler;
//  Result := Sqrt(V.X * V.X + V.Y * V.Y);
Asm
    FLD     TBYTE PTR [V.TVector2D.X]
    FMUL    ST(0), ST(0)

    FLD     TBYTE PTR [V.TVector2D.Y]
    FMUL    ST(0), ST(0)

    FADDP

    FSQRT
End;
{$ELSE}
Begin
    Result := Sqrt(Sqr(V.X) + Sqr(V.Y));
End;
{$ENDIF}


Auch wenn der Pascal-Teil hier genauso wie die Sqr-Methode aussieht (ja, das ist der gleiche Quelltext), ist die ASM-Version etwa um den Faktor 2 schneller, weil der Delphi-Compiler eine ganze Menge unnötigen Kram mit ins Assembly schreibt, den man nicht brauch. Geht halt nix über handgeklöppelten Assembler ;-) Ach ja: Omorphia arbeitet intern komplett auf Extended; hängt damit zusammen, das nur in Bezug auf den Speicherzugriff wirkliche Performance-Unterschiede auftauchen. Wenn man aber den Cache der CPU richtig ausnutzt, hat man da aber keine wirklichen Nachteile.


jaenicke - Mo 21.02.11 20:55

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Geht halt nix über handgeklöppelten Assembler ;-)
Ich wünsche dir schon einmal viel Spaß bei der Portierung auf 64-Bit. ;-) Genau dafür schmeiße ich gerade vieles in dieser Richtung (und auch im Hinblick auf generische Datentypen) aus meinen Quelltexten heraus. Nur bei essentiellen Sachen werde ich dann den Assemblercode portieren.


BenBE - Mo 21.02.11 23:38

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Geht halt nix über handgeklöppelten Assembler ;-)
Ich wünsche dir schon einmal viel Spaß bei der Portierung auf 64-Bit. ;-)

Ist doch schon 64-bittig ;-)

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Genau dafür schmeiße ich gerade vieles in dieser Richtung (und auch im Hinblick auf generische Datentypen) aus meinen Quelltexten heraus. Nur bei essentiellen Sachen werde ich dann den Assemblercode portieren.

Daher auch das Abschalten von ASM-Source via Compiler. Ist eine der Source-Regeln: ASM MUSS optional sein.