Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Beitrag von ramses »

Hallo zusammen

ich jage im Moment einen Geist .... ich verarbeite Messwerte, diese kommen als 1 Byte Zeichen an. Dazu wird ein Offset addiert und das ganze dividiert um für den Menschen, die Logs und die weitere Verarbeitung den korrekten Wert mit Dezimalstellen zu erhalten. Mit diesen Werten werden verschiedene Vergleiche zur überprüfung der verschiedenen Betriebsparameter ausgeführt.

Ab und zu, etwa 1 zu 1 Mio. ist der Vergleich aber falsch!

Vereinfacht sieht das so aus:

Code: Alles auswählen

 b1 := chr(131)  // erhaltener Messwert (1 Byte aus einem CAN-Bus Telegramm)
 nUG := 3.2

 n1 := ( asc(b1)+200) / 100    // Umrechnung in Dez Wert   --> 3.31

 if n1 <= nUG     //   3.31 <= 3.2 

        //  z.B. diese Werte als Vergleich  3.31 <= 3.2  ergibt ab und zu .t. 

 endif
Der selbe Zahlen Wert wird Tage, Wochen, Monate lang korrekt beurteilt. Ab und zu jedoch fehlerhaft was dann zu ersthaften Problemen führt ....

Alle Werte stehen in Klassenvariablen, Arrays auf die schreibend nur über Sync Methoden zugegriffen wird. Zum Vergleich werden die Werte zuerst in local's geladen und nur mit diesen locals gearbeitet und aus diesen auch geloggt.

Hat jemand eine Idee was hier schiefläuft?
Valar Morghulis

Gruss Carlo
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Beitrag von Wolfgang Ciriack »

Also ich mache vor dem Vergleich von numerischen Werten, die vorher geteilt werden, immer ein Round() davor, also
if RoundZ(n1, 2) <= RoundZ(nUG , 2)
wobei ich RoundZ() statt Round() benutze, da ich bei Round() auch Probleme gefunden habe:
** Ersatz für Round Eurowerte, bei 14,29 * 19.00 -> 2,7151 ergibt Round 2,71 und nicht 2.72
Function RoundZ(nValue)
Return (Round(Round(nValue, 4), 2))
Viele Grüße
Wolfgang
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Beitrag von Marcus Herz »

Vielleicht verzichtest du auf die Division von 100 und vergleichst die Ganzzahlen

Code: Alles auswählen

 
  b1 := chr(131)  // erhaltener Messwert (1 Byte aus einem CAN-Bus Telegramm)
 nUG := 320

 n1 := ( asc(b1)+200)     // keine Umrechnung in Dez Wert  

 if n1 <= nUG     //   331 <= 320
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Beitrag von ramses »

Danke für die Tips. Es hilft mir schon viel weiter zu wissen dass auch bei euch solche Probleme auftreten .....

Die Idee keine Division zu verwenden würde bedeuten den ganzen Code zu überarbeiten das ist sehr schwer umzusetzen ich versuche es mal an den kritischen Stellen mit der Runde Funktion zu entschärfen ....
Valar Morghulis

Gruss Carlo
Antworten