代码之家  ›  专栏  ›  技术社区  ›  ysth

如何在Perl中创建或测试NaN或infinity?

  •  22
  • ysth  · 技术社区  · 15 年前

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

    6 回复  |  直到 15 年前
        1
  •  15
  •   Hynek -Pichi- Vychodil Paulo Suassuna    12 年前
    print "Is NaN\n" if $a eq 'nan';
    print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
    

    编辑

        2
  •  15
  •   Borodin    7 年前

    这里有一个相当可靠的方法:

    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
    
        3
  •  7
  •   dolmen    10 年前

    使用 Data::Float 来自CPAN。它导出以下功能:

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

    与这里发布的其他半工作解决方案相反,它有一个 testsuite .

        4
  •  7
  •   serenesat    9 年前

    Math::BigFloat (或 BigInt NaN

    既然已经有模块可以完成这项工作,为什么还要用黑客解决方案重新发明轮子呢?

        5
  •  0
  •   jwal    8 年前

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

    链接文章指出,当底层c实现支持nan时,“nan”==“nan”永远都不是真的,因为nan无法匹配自身。

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

    我猜在perl已经优雅地降级,而代码还没有降级的环境中运行代码的风险可能不够低,因此您不必太担心。

        6
  •  -1
  •   Erik Aronesty    11 年前

    简洁的答案如下。

     {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")}