AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
Thema durchsuchen
Ansicht
Themen-Optionen

Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

Ein Thema von fox67 · begonnen am 20. Jun 2015 · letzter Beitrag vom 21. Jun 2015
Antwort Antwort
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 00:52
Den Debugger habe ich benutzt, das x den wert 1 hat ist ganz normal das ist ca. bei den ersten 10 logs so und jedesmal wenn irgentein ereigniswar z.B: wenn ein neuer Flieger vom Kollisionswarngerät erfasst wurde. Da das Programm die ersten 10 werte geschluckt hat und beiden den war der wert x öfters 1 und auch bis zur fehlermeldung ist es bestimmt mehr als hundert mal aufgetreten das x= 1 ist daran kann der fehler eigentlich nicht liegen.
Gruß Arni
  Mit Zitat antworten Zitat
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 01:26
So ganz schlüßig ist mir das Problem nicht anscheinend manchmal passiert nichts wenn x = 1 ist und manchmal kommt die fehlermeldung wenn x= 1 ist, dann hilft aber auch eine if(if x=1 then) abfrage nicht den er sieht die bedingung x=1 als false an(warum auch immer) Was alerdings hilft ist das x mithilfe von trunc in eine Integervariable umzuwandeln und dann zu überprüfen ob x = 1 ist dann klappt es einwandfrei. Gibt es eine erklärung warum 1 als double nicht immer gleich 1 ist?
Gruß Arni
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 05:20
Ja, das wird hier auch fast wöchentlich durchgekaut. Gleitkommawerte sind in den allerwenigsten Fällen exakt der Wert, den man zuweist/errechnen würde. Sie sind halt nicht unendlich genau, weil dann würden sie unendlich viel Speicher brauchen. (Und unendliche Prozessoren.) Der Wert "1" kann zwar theoretisch exakt dargestellt werden, wenn er aber das Ergebnis einer vorausgegangenen Rechnung ist, ist es sehr wahrscheinlich, dass die 1 nicht exakt getroffen wird. Vermutlich war die 1 in den Fällen in denen es ging eher eine 0,999999999999872136, und in Fällen wo es nicht ging 1,0000000000001234473 (oder so).
Das ist, wie ebenfalls an der Tagesordnung hier, auch der Grund, warum man Floats NIEMALS auf Gleichheit mit anderen Werten prüft. Dafür gibt es die Funktion SameValue() in der Unit Math, die um den potenziell gemachten Fehler* weiss, und ihn je nach Datentyp (Single, Double oder Extended) angepasst berücksichtigt. Du musst also vor dem ArcCos() auf SameValue(x, 1) und SameValue(x, -1) prüfen.

*) Der Fehler ist prinzipbedingt und im Rahmen von Gleitkommazahlen auch niemals zu eliminieren. Wenn man sich mal, z.B. auf der Wikipedia, anschaut wie diese intern dargestellt werden, wird auch recht schnell klar warum das so ist. Ich bin immer wieder platt, WIE viele "Programmierer" um solche absolut elementaren Grundlagen nicht wissen. Was bringen euch eure Ausbilder/Profs bei, bzw. bei Hobbyisten: Was für schrottige Bücher nehmt iht? Die gehören verboten!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 07:40
Wenn ich das programmieren müsste würde ich nicht unbedingt vorher auf SameValue( x, 1 ) prüfen, sondern den record
Delphi-Quellcode:
if posA = posB then
  dist := 0
else
  ...
Ja der record benötigt dann einen class operator Equal .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 10:48
Hm das ist Interessant rundet die Überwachen anzeige eigentlich beim darstellen? Den im Überwachen Fenster stand immer exakt 1 drin sonst waren es immer auf zig Nachkomastellen angezeigt nur wenn die Distanz 0 war hat es 1 angezeigt wie es sein sollte nur des es dann wahrscheinlich eine paar mal nicht 1 sonder ganz leicht größer war. Kann man das irgentwie einstellen das im Debugger die exakten Werte angezeigt werden? Dan wäre mir der Fehler auch aufgefallen.
Gruß Arni
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 11:40
Ja. Tut sie. Double sind leider immer nur ungefähr. Also niemals auf Gleichheit prüfen, wie schon gesagt.

Denk Dir einfach, das 1 auch 1.000000000000000000123 sein könnte, ohne das man das sieht.

Aber das wurde alles schon erklärt.

Leider kann Delphi kein BCD. Von Hause aus.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus

  Alt 21. Jun 2015, 11:57
Denk Dir einfach, das 1 auch 1.000000000000000000123 sein könnte, ohne das man das sieht.
Aber ehrlich gesagt: Wenn der Debugger das nicht richtig (bitgenau) anzeigt ist er entweder Schrott oder zumindest falsch eingestellt.

Pragmatisch lässt sich das Problem so lösen, ob die Distanz dann noch korrekt funktioniert musst du wissen.
Delphi-Quellcode:
if x >= 1 then
  dist := 0
else if x <= -1 then
  dist := FAK*pi
else dist := FAK*arccos(x);
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz