Pavel Pelán Programování Mosaic 8. 3. 2021 19:42 10. 2. 2021 9:30

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ý.