Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus (https://www.delphipraxis.net/185569-distanzberechnung-zwischen-zwei-koordinaten-gibt-manchmal-eine-fehlermeldung-aus.html)

fox67 20. Jun 2015 23:13

Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
ich bin gerade Dabei ein Programm das eine Datei aus einem Fluglogger(aus einem Segelflieger) ausließt und dann eine Strecke raus optiemieren soll(wie z.B hier). Im Internet findet man nicht viel wie so ein Algorithmus funktionieren könnte, aber ich hab ein Quellcode gefunden auf github. Allerdings in C jetzt bin ich gerade dabei das Schritt für Schritt in Delphi umzusetzen. Aber beim berechnen der Distanzmatrix kommt bei einem bestimmten Punkt die Fehlermeldung daß es eine ungültige Gleitkommaoperation sei, obwohl es davor schon einige 1000 distanzen fehlerfrei ausgerechnet hat. Um den Fehler nachzuvollziehen gebe ich den Index der Zwei Punkte aus zwischen denen die Distanz berechnet wird in einer Memo aus. Der Fehler tritt zum erstenmal auf wenn er den 12 mit dem 51 Punkt vergleicht. Leider kann ich absolut nicht nachvollziehen warum der Fehler auftritt schließlich hat er ja davor schon einige tausen distanzen fehlerfrei berechnet. Im Anhang habe ich das komplette Projekt mit quellcode und der Logger datei(.IGC).
Das ist die Funktion in der der Fehler auftritt.
Delphi-Quellcode:
function TFlug.dpointtopoint(index1: Integer; index2: Integer) : integer;
var
dist,x : double;
sli,cli,lri : double;

begin
  sli := Punkte[index1].sinlat;
  cli := Punkte[index1].coslat;
  lri := Punkte[index1].lonrad;
  x := sli*Punkte[index2].sinlat;
  x := x + cli*Punkte[index2].coslat * cos(lri - Punkte[index2].lonrad);
  form10.Memo1.Text := 'i: '+ inttostr(index1) +'|j: '+inttostr(index2);
  Application.ProcessMessages;
  if (index1=12) and (index2=51) then
  begin
    dist := 0;

  end
  else dist := FAK*arccos(x);

  result := round(dist);
end;

Sir Rufo 21. Jun 2015 00:16

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
Und jetzt?

Wir sollen uns also dein Projekt herunterladen und ausführen und selber herausfinden, welcher Fehler auftritt und auch selber die Werte der Koordinaten herausfinden um dir zu helfen?

Ist bei dir heute Ostern und Weihnachten zugleich?
Oder klemmt die Zwischenablage?

Also:

Fehlermeldung per CopyPaste hier posten und die Werte der beiden Koordinaten, bei denen dieser Fehler kommt, dann können wir uns den Download komplett schenken.

fox67 21. Jun 2015 00:37

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
Nein natürlich nicht, aber ich kann den Fehler absolut nicht nachvollziehen und hab gehofft des jemand hier im Forum villeicht so ein ähnlich es problem schon mal hatte? Der Fehler ensteht erst wenn der arcuscosinus berechnet wird. Was ich nicht verstehe davor hat das programm zig mal für den selben wert den arcuscosinus errechnet ohne probleme und da kommt aufeinnmal der Fehler. Die Distanz sollte 0 sein da x = 1 ist. Die Koordinaten sind: 51°18.014'N 014°07.87'E und der Punkt2 hat die selben Koordinaten, deshalb auch der Abstand 0.

himitsu 21. Jun 2015 00:42

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
Zitat:

Zitat von arccos
Die Werte von X müssen zwischen -1 und 1 liegen.

Und X ist da 1.

Aber wer benutzt schon den Debugger? :roll:
Haltepunkt auf den Anfang der Funktion und als Bedingung
Delphi-Quellcode:
(index1 = 12) and (index2 = 55)
angeben. (das sind übrigens die Werte, wo es immer knallt)

fox67 21. Jun 2015 00:49

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Fehler Nachricht ist im Anhang

fox67 21. Jun 2015 00:52

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
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.

fox67 21. Jun 2015 01:26

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
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?

Medium 21. Jun 2015 05:20

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
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!

Sir Rufo 21. Jun 2015 07:40

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
Wenn ich das programmieren müsste würde ich nicht unbedingt vorher auf
Delphi-Quellcode:
SameValue( x, 1 )
prüfen, sondern den record
Delphi-Quellcode:
if posA = posB then
  dist := 0
else
  ...
Ja der record benötigt dann einen
Delphi-Quellcode:
class operator Equal
.

fox67 21. Jun 2015 10:48

AW: Distanzberechnung zwischen zwei Koordinaten gibt manchmal eine Fehlermeldung aus
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
Seite 1 von 2  1 2      

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