2012-07-05 76 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中具有实际的位级表示)。