我如何创造或测试南或无限值在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';

修改:固定为负无穷大

使用 数据::Float 从求助.它的出口下列职能:

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

相反其他人一半的工作方案张贴在这里,它有一个 严格的测试套件.

就个人而言,我会使用Math::BigFloat(或BigInt),用于任何将要触摸NaN的无穷大。

为什么用时已经存在该做的工作模块,一个黑客的解决方案推倒重来?

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

链接的文章指出,"南"=="南"是不正确的,当基础c执行支持南,因为南不能比赛本身。

这是很好的说明

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

我猜风险的运行,你代码的环境中perl有退化地及你的代码有没有可能低的足以使你不用担心太多。

当然,如果你不想perl插为一个数字使用'eq'不'=='

这工作简洁答案如下:

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")}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top