Perl で NaN または無限値を作成またはテストするにはどうすればよいですか?
13479 次
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
(または)を使用します。BigInt
NaN
仕事をするモジュールがすでにあるのに、なぜハックソリューションで車輪の再発明をするのですか?
于 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 に答える