6

warningsプラグマが「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
4

3 に答える 3

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'"

Perl 5.22以降を使用しない限り、プラットフォームごとに異なる結果が得られる可能性があります。

于 2012-07-05T14:01:54.913 に答える
7

「数値ではない」は、「NaN」として最も頻繁に表される値の長い名前です。ウィキペディアの記事も参照してください。NaNを使用した計算は、実際には意味があります(IEEE754では実際のビットレベル表現もあります)。

于 2012-07-05T14:02:28.817 に答える
-4

NaNin文字列の数値版ですNiL

于 2012-07-05T14:00:07.330 に答える