Autor Beitrag
>M@steR<
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 288
Erhaltene Danke: 3



BeitragVerfasst: So 20.02.11 23:52 
Gelöscht


Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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< Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 288
Erhaltene Danke: 3



BeitragVerfasst: Mo 21.02.11 00:09 
Gelöscht


Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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< Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 288
Erhaltene Danke: 3



BeitragVerfasst: Mo 21.02.11 00:22 
Gelöscht


Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
  Result := Sqrt(Sqr(Vector.X) + Sqr(Vector.Y));					
>M@steR< Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 288
Erhaltene Danke: 3



BeitragVerfasst: Mo 21.02.11 15:53 
Gelöscht


Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:46, insgesamt 1-mal bearbeitet
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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:


ausblenden 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.


Zuletzt bearbeitet von Tranx am Mo 21.02.11 19:25, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 21.02.11 19:17 
Keines von beiden:

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

ausblenden 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.

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
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.