Perl除零 - 需要无穷大

时间:2015-12-22 16:40:32

标签: perl

有没有办法从inf-inf而不是eval {1/0}例外获取eval {1/-0}Illegal division by zero

3 个答案:

答案 0 :(得分:4)

开箱即用?不,因为这是错误的答案。除以零是未定义不是无限的。

您可以使用//之类的内容来测试eval的结果是否未定义:

my $result = eval { 1/0 } // 'inf';
print $result;

并设置默认方式。 (虽然在上面,'inf'是字符串;数值可能更有用)。有一些数学库可以为您提供inf类型常量,例如bignum bigrat bigint。但是可移植性可能是一个问题。

答案 1 :(得分:2)

如果您use bignum,您inf将获得1/0

use bignum;
print 1 / 0; # produces "inf"

1/-0仍然是inf(我猜是因为-0 == 0)。

请参阅http://perldoc.perl.org/bignum.html

答案 2 :(得分:2)

你真正需要的是Data::Float

#!/usr/bin/env perl

use strict;
use warnings;

use Carp qw( croak );
use Data::Float qw( have_infinite pos_infinity neg_infinity float_is_infinite);

have_infinite() or croak "No support for infinite float values";

my $v = -1;
my $x = 1;
my $y = 0;

my $z = eval { $x/$y };
unless (defined $z) {
    $z = ($x >= 0) ? pos_infinity : neg_infinity;
}

print "$z\n";

$z = eval { $v/$y };
unless (defined $z) {
    $z = ($v >= 0) ? pos_infinity : neg_infinity;
}

print "$z\n";

输出:

$ ./inf.pl
Inf
-Inf

当然,如果你使用5.10或更高版本,你可以这样做:

my $z = eval { $x/$y };
$z //= ($x >= 0) ? pos_infinity : neg_infinity;

print "$z\n";

$z = eval { $v/$y };
$z //= ($v >= 0) ? pos_infinity : neg_infinity;

print "$z\n";