Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
wir haben festgestellt, dass unser Steuerungsprogramm in manchen Fällen falsch rundet. Daraufhin haben wir ein Testprogramm erstellt, welches das Problem bestätigt. Das Ergebnis ist mit REAL_TO_INT oder LREAL_TO_INT das gleiche. Es wird nicht bei jeder Zahl bei x.5 aufgerundet.
Getestet: CODESYS for PFC200 4.0.1.0 / 3.5.15.0
Wenn man das Programm auf CODESYS for Windows laufen lässt, passt das Ergebnis.
Ist das Problem bekannt? Gibt es einen Workaround oder Bugfix?
danke für den Hinweis. Ich habe soeben den Entsprechenden Hinweis in der CODESYS-Dokumentation zur Target-Abhängigkeit gefunden. So richtig logisch finde ich das allerdings nicht. Sollte das Laufzeitsystem nicht genau solche plattformabhängigen Eigenheiten vereinheitlichen. Damit verhalten sich die Programme unterschiedlich auf verschiedenen Targets.
Und: Warum rundet REAL_TO_LINT dann anders als REAL_TO_INT?
Erschwerend kommt hinzu, dass es keine echte ROUND-Funktion gibt (kenne ich zumindest noch nicht). In der Lib FloatingPointUtils gibt es nur die Funktionen CEIL, FLOOR und TRUNCATE. Wenn die Konvertierung dies erledigen würde, wäre das kein Problem. Aber so fehlt mir nach wie vor ein Workaround, da ich leider darauf angewiesen bin, dass mein Programm mathematisch korrekt rundet.
Mir fällt nur sowas hier ein:
IF ABS(x - FLOOR(x)) >= 0.5 THEN RES := CEIL(x); ELSE RES := FLOOR(x); END_IF
Gibt es bessere Vorschläge?
VG,
Jan
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi,
wir haben festgestellt, dass unser Steuerungsprogramm in manchen Fällen falsch rundet. Daraufhin haben wir ein Testprogramm erstellt, welches das Problem bestätigt. Das Ergebnis ist mit REAL_TO_INT oder LREAL_TO_INT das gleiche. Es wird nicht bei jeder Zahl bei x.5 aufgerundet.
Getestet: CODESYS for PFC200 4.0.1.0 / 3.5.15.0
Wenn man das Programm auf CODESYS for Windows laufen lässt, passt das Ergebnis.
Ist das Problem bekannt? Gibt es einen Workaround oder Bugfix?
VG,
Jan
Last edit: jago85 2021-07-08
Hallo Jan,
Ich muss mich wohl korrigieren. Anscheinend ist das so, siehe Kommentar von Ian
LG
Marcel
Last edit: m.prestel 2021-07-08
Kein Bug, das ist wie ARM FPU funktioniert:
https://developer.arm.com/documentation/dui0475/k/floating-point-support/ieee-754-arithmetic-and-rounding
1. Wenn xxx.5, Round to even.
2. Sonst Round to nearest.
Hallo Marcel, hallo Ian,
danke für den Hinweis. Ich habe soeben den Entsprechenden Hinweis in der CODESYS-Dokumentation zur Target-Abhängigkeit gefunden. So richtig logisch finde ich das allerdings nicht. Sollte das Laufzeitsystem nicht genau solche plattformabhängigen Eigenheiten vereinheitlichen. Damit verhalten sich die Programme unterschiedlich auf verschiedenen Targets.
Und: Warum rundet REAL_TO_LINT dann anders als REAL_TO_INT?
Erschwerend kommt hinzu, dass es keine echte ROUND-Funktion gibt (kenne ich zumindest noch nicht). In der Lib FloatingPointUtils gibt es nur die Funktionen CEIL, FLOOR und TRUNCATE. Wenn die Konvertierung dies erledigen würde, wäre das kein Problem. Aber so fehlt mir nach wie vor ein Workaround, da ich leider darauf angewiesen bin, dass mein Programm mathematisch korrekt rundet.
Mir fällt nur sowas hier ein:
Gibt es bessere Vorschläge?
VG,
Jan