Seite 1 von 1

Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Verfasst: Mi, 07. Jun 2023 9:19
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?

Re: Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Verfasst: Mi, 07. Jun 2023 14:34
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))

Re: Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Verfasst: Mi, 07. Jun 2023 16:34
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

Re: Numerischer Vergleich <= liefert sporadisch falsches Ergebnis

Verfasst: Do, 08. Jun 2023 10:21
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 ....