2015-12-22 2 views
0

Есть ли способы получить inf или -inf от eval {1/0}, eval {1/-0} вместо Illegal division by zero исключение?Perl division by zero - need infinity

+2

Связанный: http://stackoverflow.com/questions/13645034/is-there-an-inf-constant-in-perl. – ruakh

+0

@руах, я знаю, что это 'inf' в perl, мой вопрос о том, как получить его из деления на ноль. –

+2

Все, что я написал, это то, что этот вопрос связан. Люди, которые находят ваш вопрос, также могут быть заинтересованы в этом вопросе. (Помните, ваш вопрос не только для вас.) – ruakh

ответ

1

Если вас use bignum, вы получите inf из 1/0:

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

1/-0 еще inf (я предполагаю, что это потому, что -0 == 0).

См. http://perldoc.perl.org/bignum.html.

+0

Но '-1/0' возвращает' -inf', и для меня это кажется достаточно) Спасибо! –

4

Из коробки? Нет, потому что это неправильный ответ. Подразделение на ноль - не определено не бесконечно.

Вы могли бы использовать что-то вроде //, чтобы проверить, если результат вашей eval не определено:

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

И установлено, что способ по умолчанию. (Хотя в приведенном выше примере, 'inf' является строкой, числовое значение может быть более полезным). Существует набор библиотек математики, которые дают вам константы inf, такие как bignumbigratbigint. Однако переносимость может быть проблемой.

+0

Но таким образом я не могу отличить + и - бесконечность. Что касается вашей заметки о бесконечности - это сложный вопрос: https://www.quora.com/Is-1-0-infinity. Мне нужно специальное числовое значение 'inf' в моем случае. –

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"; 
+0

Пожалуйста, не могли бы вы привести пример, как я могу использовать его для разделения? –

+0

@EugeneSoldatov См. Обновленный ответ. –

+0

Хорошо, теперь я понимаю, спасибо! –