2012-07-05 4 views
6

Sono un po 'sorpreso (e spaventato) dal fatto che il pragma warnings non si lamenta del fatto che "NaN" e "nan" non sono numerici.Perché il valore 'NaN' è numerico secondo il pragma delle avvertenze?

Perché il warnings non emette il consueto 'Argument isn't numeric in addition (+) per loro?

Test Case

$ perl -Mstrict -wE 'say 0+$_ for qw/string NaN nan fail/;' 
Argument "string" isn't numeric in addition (+) at -e line 1. 
0 
0 
0 
Argument "fail" isn't numeric in addition (+) at -e line 1. 
0 
+3

http://en.wikipedia.org/wiki/NaN 'NaN' è un valore valido di un numero in virgola mobile, proprio come +/- infinito. – biziclop

risposta

10

Da perlop

binario "< =>" restituisce -1, 0 o 1 a seconda che il tesi sinistra è numericamente inferiore, uguale o superiore a destra argomento. Se la tua piattaforma supporta i NaN (non-numeri) come valori numerici , utilizzarli con "< =>" restituisce undef. NaN non è "<", "==", ">", "< =" o "> =" nulla (anche NaN), quindi quelli 5 restituiscono false. NaN! = NaN restituisce true, così come NaN! = Qualcos'altro.

Se la piattaforma non supporta NaNs poi Nan è solo una stringa con valore numerico 0.

NaN si comporta in modo diverso su diverse piattaforme. È in un certo senso numerico in quanto può agire come tale nelle operazioni numeriche. Ma in realtà non è un numero in quanto ha un valore indefinito.

Inoltre il suo comportamento non è portatile come:

perl -E "say 'yes' if 0 == 'NaN'" 

potrebbe portare a risultati diversi su piattaforme diverse a meno che non si utilizza Perl 5.22 o più recente.

+0

Quindi "NaN" non è un numero solo per nome? Dietro le quinte ha in realtà una rappresentazione numerica? – Zaid

+0

Vedere la risposta aggiornata. –

+3

@Zaid, NaN non è un numero in base a una definizione normale, ma è un float IEEE valido. – ikegami

-4

NaN è la controparte numerica di NiL nelle stringhe.

7

"Non un numero" è il nome lungo per il valore rappresentato più spesso come "NaN". Vedi anche the wikipedia article. Il calcolo con NaN è effettivamente significativo (ha persino una rappresentazione a livello di bit effettiva in IEEE754).

Problemi correlati