2012-07-05 77 views
6

我對warnings附註不抱怨「NaN」和「nan」是非數字的事實感到有點驚訝(也很害怕)。爲什麼根據警告編譯指示'NaN'數字?

爲什麼warnings對他們沒有排出習慣'Argument isn't numeric in addition (+)

測試用例

$ 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'是一個浮點數的有效值,就像+/-無窮大一樣。 – biziclop 2012-07-05 13:58:55

回答

10

perlop

二進制 「< =>」 取決於左 參數是否大於比右 參數數值小於,等於,或大於-1,0或1返回。如果您的平臺支持NaN(非數字)作爲數值 值,則將它們與「< =>」一起使用會返回undef。 NaN不是「<」,「==」, 「>」,「< =」或「> =」任何東西(甚至是NaN),所以這5個返回錯誤。 NaN!= NaN返回true,NaN!也是如此。

如果你的平臺 不支持NaN的那麼NaN的僅僅是一個數值串0

NaN的行爲在不同平臺上的不同。它在數字運算中可以起到這樣的作用。但它也不是一個數字,因爲它沒有明確的價值。

而且其行爲是不可移植的:除非你使用Perl 5.22或更高版本

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

可能產生在不同的平臺不同的結果。

+0

所以'NaN'不是一個數字嗎?在幕後它實際上有一個數字表示? – Zaid 2012-07-05 14:09:59

+0

查看最新的答案。 – 2012-07-05 14:40:33

+3

@Zaid,NaN不是任何正常定義的數字,但它是一個有效的IEEE浮點數。 – ikegami 2012-07-05 15:46:03

-4

NaNNiL在字符串中的數字對應。

7

「不是數字」是最常表示爲「NaN」的值的長名稱。另見the wikipedia article。用NaN進行計算實際上是有意義的(它甚至在IEEE754中具有實際的位級表示)。