の作成方法を教えてくださいまたは試験のためのNaNまたは無限大Perl?

StackOverflow https://stackoverflow.com/questions/1185822

  •  19-09-2019
  •  | 
  •  

質問

の作成方法を教えてくださいまたは試験のためのNaNまたは無限の価値Perl?

役に立ちましたか?

解決 2

ここではかなり信頼性の高い方法です

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

他のヒント

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

編集:負の無限大のために修正された。

使用 データ::浮動小数点数 CPANから。次の関数をエクスポートします。

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

そして、ここに掲載されている他の中途半端なソリューションとは対照的に、それは テストスイート.

個人的に、私はMath::BigFloatの無限大に触れるために起こっている何のためBigInt(またはNaN)を使用します。

仕事をするモジュールが既に存在しているのに、なぜハック溶液で車輪の再発明?

私が検索されたこのサイト(こちら) http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

リンク先の第摘して"nan"=="nan"はtrueることができたり、背後にあるcの実装を支えNaNがNanできない試合そのものです。

このラグラ

die "This perl does not support NaN!\n" if "NaN" == "NaN";

しないといけないのではないかリスクの走行コードする環境にperlが劣化した優雅にコードがないか十分に低いような心配しなくてよいでしょう。

もちろん行わない場合はperlに補間が数値として使用eq'しない'=='

次の作品

簡潔な答えます。

1:(たとえば、printf関数に)出力のための "NAN" 変数を作成する方法:

 {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")}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top