为什么'NaN'数字根据警告pragma?

Zai*_*aid 6 perl nan

由于warningspragma并没有抱怨'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
Run Code Online (Sandbox Code Playgroud)

mat*_*ull 10

来自perlop

二进制"<=>"返回-1,0或1,具体取决于左参数是否在数值上小于,等于或大于右参数.如果您的平台支持NaN(非数字)作为数值,则将它们与"<=>"一起使用将返回undef.NaN不是"<","==",">","<="或"> ="任何东西(甚至是NaN),所以那些5返回false.NaN!= NaN返回true,NaN也是如此!=其他任何东西.

如果您的平台不支持NaN,那么NaN只是一个数字值为0的字符串.

NaN在不同平台上表现不同.它在某种程度上是数值的,因为它可以在数值运算中起作用.但它也不是一个数字,因为它具有未定义的价值.

此外,它的行为不可移植:

perl -E "say 'yes' if 0 == 'NaN'"
Run Code Online (Sandbox Code Playgroud)

除非您使用Perl 5.22或更高版本,否则可能会在不同平台上产生不同的结果.

  • @Zaid,NaN不是任何正常定义的数字,但它是有效的IEEE浮点数. (3认同)

The*_*wan 7

"不是数字"是通常表示为"NaN"的值的长名称.另请参阅维基百科文章.使用NaN进行计算实际上是有意义的(它甚至在IEEE754中具有实际的位级表示).