如何在Perl中创建或测试NaN或无穷大?

yst*_*sth 23 perl nan infinity

如何在Perl中创建或测试NaN或无限值?

Hyn*_*dil 14

print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
Run Code Online (Sandbox Code Playgroud)

编辑:修正负无穷大.

  • Inf是不是很完美,你也想检查'-inf'. (3认同)
  • 如果$ a不是数字,但实际上是字符串"nan"怎么办? (2认同)

yst*_*sth 12

这是一种相当可靠的方式:

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));
}
Run Code Online (Sandbox Code Playgroud)

输出是:

inf:    isinf: 1,   isnan: 0,   signbit: 0
-inf:   isinf: 1,   isnan: 0,   signbit: 1
nan:    isinf: 0,   isnan: 1,   signbit: 0
Run Code Online (Sandbox Code Playgroud)

  • 只是不要在bigint下使用它,否则你会想知道你的程序挂起的原因. (9认同)
  • 是的,在bigint下,使用Math :: BigInt-> bnan(), - > binf()或 - > binf(' - '). (6认同)
  • 在5.10及以上版本中,C库支持它,只有0+"nan",0 +"inf"或0 +" - inf"也可以工作. (5认同)
  • 我更担心有人打开bigint但你没注意到的情况.:) (3认同)
  • @daotoad:是的,只是一个简单的方法.不幸的是,有些代码使用了100**1000这样的东西,它具有IEEE双精度的无穷大,但不具有长双精度的无限. (2认同)

cli*_*way 6

就个人而言,我会使用Math::BigFloat(或BigInt)任何会触及无限的东西NaN.

为什么在已有模块完成工作的情况下,为什么要用黑客解决方案重新发明轮子?


dol*_*men 6

使用CPAN中的Data :: Float.它导出以下功能:

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

与此处发布的其他半工作解决方案相反,它有一个测试套件.