SA0054: Vergleich von REAL/LREAL auf Gleichheit/Ungleichheit
Funktion | Ermittelt, wo die Vergleichsoperatoren = (Gleichzeit) und <> (Ungleichheit) Operanden vom Typ REAL oder LREAL vergleichen. |
Begründung | REAL/LREAL-Werte werden als Gleitpunktzahlen nach dem Standard IEEE 754 implementiert. Dieser Standard bringt es mit sich, dass bestimmte scheinbar einfache Dezimalzahlen nicht exakt dargestellt werden können. Das hat zur Folge, dass es für dieselbe Dezimalzahl unterschiedliche Repräsentationen als LREAL geben kann. Beispiel:
bTest wird in diesem Fall FALSE liefern, auch wenn die Variablen fLREAL_a und fLREAL_b beide den Monitoring-Wert “2.2” liefern. Das ist kein Fehler des Compilers, sondern eine Eigenschaft der Gleitpunkteinheiten aller üblichen Prozessoren. Vermeiden können Sie das, indem Sie einen Mindestwert angeben, um den sich die Werte unterscheiden dürfen:
|
Ausnahme | Ein Vergleich mit 0.0 wird nicht von dieser Analyse gemeldet. Für die 0 gibt es im Standard IEEE 754 eine exakte Darstellung und daher funktioniert der Vergleich üblicherweise wie erwartet. Für eine bessere Performance ist es daher sinnvoll, hier einen direkten Vergleich zuzulassen. |
Wichtigkeit | Hoch |
PLCopen-Regel | CP54 |
Beispiele:
PROGRAM MAIN
VAR
fREAL1 : REAL;
fREAL2 : REAL;
fLREAL1 : LREAL;
fLREAL2 : LREAL;
bResult : BOOL;
END_VARbResult := (fREAL1 = fREAL1); // => SA0054
bResult := (fREAL1 = fREAL2); // => SA0054
bResult := (fREAL1 <> fREAL2); // => SA0054
bResult := (fLREAL1 = fLREAL1); // => SA0054
bResult := (fLREAL1 = fLREAL2); // => SA0054
bResult := (fLREAL2 <> fLREAL2); // => SA0054
bResult := (fREAL1 > fREAL2); // no error
bResult := (fLREAL1 < fLREAL2); // no error