Autor |
Beitrag |
>M@steR<
      
Beiträge: 288
Erhaltene Danke: 3
|
Verfasst: So 20.02.11 23:52
Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
>M@steR< 
      
Beiträge: 288
Erhaltene Danke: 3
|
Verfasst: Mo 21.02.11 00:09
Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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< 
      
Beiträge: 288
Erhaltene Danke: 3
|
Verfasst: Mo 21.02.11 00:22
Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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< 
      
Beiträge: 288
Erhaltene Danke: 3
|
Verfasst: Mo 21.02.11 15:53
Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
Zuletzt bearbeitet von Tranx am Mo 21.02.11 19:25, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 21.02.11 20:55
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 21.02.11 23:38
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|