La definizione NaN è un acronimo che indica “Not A Number”. I valore NAN per una variabile REAL in formato IEE754 è un valore che ha tutti gli 8 bit di esponente a “1” e la mantissa diversa da “0”, il segno non importa.
Quindi se lo rappresentiamo in esadecimale sarà un numero del tipo 16#7F8FFFFF, ma qualsiasi altro numero che mantenga tutti gli 8 bit di esponente a “1” e la mantissa diversa da “0” verrà indicato cone un NaN. Risulta quindi evidente che non c’è un numero univoco per rappresentare il NaN, se vuoi settare una variabile a NaN puoi utilizzare una definizione del tipo:
VAR
APtr : @DWORD;
RVars : ARRAY[0..3] OF REAL;
END_VAR
// Definizione valori REAL in esadecimale. Vedi sito:
// https://www.binaryconvert.com/convert_float.html
APtr:=ADR(RVars[0]);
@APtr:=16#41280000; //10.5
APtr:=ADR(RVars[1]);
@APtr:=16#42C80000; //100.0
APtr:=ADR(RVars[2]);
@APtr:=16#7F8FFFFF; //NaN (Not a number)
APtr:=ADR(RVars[3]);
@APtr:=16#7F800001; //NaN (Not a number)
Come vedi dall’esempio sia il valore 16#7F8FFFFF che 16#7F800001 sono riconosciuti come NaN. Da quanto espresso si deduce che non è possibile fare comparazioni sul valore NaN, e certamente potrebbero servire due cose:
- Una definizione di NaN per settare il valore in una variabile.
- Una funzione di verifica se un numero REAL e NAN. La funzione deve verificare se il numero ha gli 8 bit di esponente a “1” e la mantissa diversa da “0”.