2012-07-05 10 views
6

Jestem trochę zaskoczony (i przerażony) tym, że pragma warnings nie narzeka na "NaN" i "nan" nie będące numeryczne.Dlaczego numeryczna "NaN" jest zgodna z pragmą ostrzeżeń?

Dlaczego warnings nie emituje dla nich zwyczajowego ?

Przypadek Testowy

$ 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' jest poprawną wartością liczby zmiennoprzecinkowej, podobnie jak +/- nieskończoność. – biziclop

Odpowiedz

10

Od perlop

Binary "< =>" zwraca -1, 0 lub 1 w zależności od tego, czy w lewo argumentem jest liczbowo mniejszy, równy lub większy niż prawy argument. Jeśli twoja platforma obsługuje wartości NaN (nie-liczby) jako wartości numeryczne , użycie ich z "< =>" zwraca undef. NaN nie jest "<", "==", ">", "< =" lub "> =" wszystko (nawet NaN), więc te 5 zwracają fałsz. NaN! = NaN zwraca true, podobnie jak NaN! = Cokolwiek innego.

Jeśli platforma nie obsługuje Nans następnie NaN to tylko ciąg z wartością liczbową 0.

NaN zachowuje się inaczej na różnych platformach. Jest w pewnym sensie numeryczny, ponieważ może działać jako taki w operacjach numerycznych. Ale tak naprawdę nie jest liczbą, ponieważ ma nieokreśloną wartość.

Ponadto jego zachowanie nie jest przenośne, jak:

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

może przynieść różne rezultaty na różnych platformach, chyba że używasz Perl 5.22 lub nowszej.

+0

A więc "NaN" nie jest numerem tylko z nazwy? Za kulisami faktycznie ma numeryczną reprezentację? – Zaid

+0

Zobacz zaktualizowaną odpowiedź. –

+3

@ Zaid, NaN nie jest liczbą według normalnej definicji, ale jest prawidłową wartością float IEEE. – ikegami

-4

NaN jest odpowiednikiem numeryczna NiL w ciągi.

7

"Nie liczba" to długa nazwa dla wartości najczęściej przedstawianej jako "NaN". Zobacz także the wikipedia article. Obliczanie za pomocą NaN jest rzeczywiście znaczące (nawet ma rzeczywistą reprezentację na poziomie bitów w IEEE754).

Powiązane problemy