Dobrý den,
uvažuji následující podmínku:
if (teplota = NaN) then
...
end_if;
1) Jak se zapíše podmínka, aby se detekovalo NaN u proměnné teplota?
Zkoušel jsem NaN := x <> x; , ale bez úspěchu.
2) Jsou hodnoty NaN $7FFFFFFF a $FFFFFFFF rovnocenné v podmínce?
3) Jak se zapíše podmínka, aby se detekovaly hodnoty +INF/-INF.
Děkuji.
Odpovědi 1
M.B.
10. 2. 2021 9:26
Dobrý den,
ad 1 a 2) Výsledky operací z hodnotou NaN nejsou definované, takže nelze přímo využít NaN jako konstantu v podmínkách a překladač neumožnuje hodnotu přímo deklarovat.
ad 3) Pro detekci neplatných hodnot a +/- nekočno je možné využít funkci definovanou v open source knihovně OSCAT. Viz níže.
FUNCTION CHK_REAL : BYTE
(*
this function checks a floating point variable of type real (IEEE754-32Bits) for NAN and infinity
RETURN values: #0 = normal value, #20 = +infinity, #40 = -infinty, #80 = NAN
version 1.0 20. jan. 2011
programmer hugo
tested by tobias
*)
VAR_INPUT
X : REAL;
END_VAR
VAR
pt : PTR_TO DWORD;
tmp : DWORD;
END_VAR
(* @END_DECLARATION := '0' *)
pt := ADR(X); (* move real to dword, real_to_dword does not work becasze it treats dword as a number on many systems *)
tmp := ROL(pt^, 1); (* rotate left foir easy checking, sign will be at lease significant digit *)
IF tmp < 16#FF000000 THEN
CHK_REAL := 16#00; (* normalized and denormalized numbers *)
ELSIF tmp = 16#FF000000 THEN
CHK_REAL := 16#20; (* X is +infinity see IEEE754 *)
ELSIF tmp = 16#FF000001 THEN
CHK_REAL := 16#40; (* X is -infinity see IEEE754 *)
ELSE
CHK_REAL := 16#80; (* X is NAN see IEEE754 *)
END_IF;
(* revision history
hm 20. jan. 2011 rev 1.0
original version
*)
END_FUNCTION
Tento dotaz je vyřešený.