如何创建或测试NaN或无穷在Perl?(How do I create or test for NaN or infinity in Perl?)

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

Answer 1:

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

编辑 :固定为负无穷大。



Answer 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


Answer 3:

使用数据::浮法从CPAN。 它导出了以下功能:

  • float_is_infinite(
  • float_is_nan()
  • ...

而且违背了别人半工作解决方案张贴在这里,它有一个测试套件



Answer 4:

就个人而言,我会用Math::BigFloat (或BigInt )用于任何将要触及的无限NaN

为什么要重复使用时已经存在该做的工作模块,一个黑客的解决方案轮子呢?



Answer 5:

当我搜索我得到了这个网站(点击这里)和http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

链接的文章指出,“南” ==“楠”是不正确的,当底层的C实现支持NaN的,因为楠无法比拟的本身。

这很好地与示出

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

我猜你运行在Perl有优雅降级的环境代码的风险,你的代码有没有可能是足够低,这样你就不用太担心。

当然,如果你不想Perl来插值为数字,使用情商'而不是“==”



Answer 6:

的作品简洁的回答如下。

1:如何创建用于输出一个“NAN”变量(对printf,例如):

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

2:如何测试“NAN”(看起来像ASCII艺术):

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

3:如何创建一个“INF”和INFN变量:

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

4:如何测试(的迹象),“INF”:

sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}


标签