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)); l := sqrt(x*x + y*y); |
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; 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
BenBE hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!