26

Perl で NaN または無限値を作成またはテストするにはどうすればよいですか?

4

6 に答える 6

15
print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';

EDIT : 負の無限大に対して修正されました。

于 2009-07-27T09:08:47.020 に答える
15

かなり信頼できる方法は次のとおりです。

my $inf    = 9**9**9;
my $neginf = -9**9**9;
my $nan    = -sin(9**9**9);

sub isinf { $_[0]==9**9**9 || $_[0]==-9**9**9 }
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
# useful for detecting negative zero
sub signbit { substr( sprintf( '%g', $_[0] ), 0, 1 ) eq '-' }

for my $num ( $inf, $neginf, $nan ) {
   printf("%s:\tisinf: %d,\tisnan: %d,\tsignbit: %d\n", $num, isinf($num), isnan($num), signbit($num));
}

出力は次のとおりです。

inf:    isinf: 1,   isnan: 0,   signbit: 0
-inf:   isinf: 1,   isnan: 0,   signbit: 1
nan:    isinf: 0,   isnan: 1,   signbit: 0
于 2009-07-26T23:07:08.517 に答える
7

個人的には、の無限大に触れるものすべてにMath::BigFloat(または)を使用します。BigIntNaN

仕事をするモジュールがすでにあるのに、なぜハックソリューションで車輪の再発明をするのですか?

于 2009-07-29T08:50:25.993 に答える
7

CPAN のData::Floatを使用します。次の関数をエクスポートします。

  • float_is_infinite()
  • float_is_nan()
  • ...

また、ここに掲載されている他のハーフワーキングソリューションに反して、テストスイートがあります。

于 2013-03-20T14:58:21.177 に答える
-1

うまくいく簡潔な答えは次のとおりです。

1:出力用の「NAN」変数を作成する方法(たとえば、printfへ):

 {no strict 'subs'; $NAN="NAN"+1;}

2:「NAN」(アスキーアートのように見える)をテストする方法:

 sub isnan {!($_[0]<=0||$_[0]>=0)}

3:「INF」およびINFN変数を作成する方法:

{$INF="INF"+1; $INFN=-"INF"+1}

4:「INF」(任意の符号)をテストする方法:

sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}
于 2012-10-19T17:32:02.617 に答える