Что такое perl-эквивалент MAX_INT?
Я новичок в perl и искал наименьшее значение в @array
. Есть ли константа, представляющая очень большое целое число?
Я знаю, что могу сортировать массив и начинать, но это, похоже, много потраченных циклов процессора. Что является элегантным решением моей проблемы в Perl?
Ответы
Ответ 1
В общем случае вы можете использовать undef
для сигнализации несуществующего значения; perl-скаляры не ограничиваются только целыми числами. Это было бы написано:
my $min; # undef by default
for my $value (@array) {
$min = $value if !defined $min or $value < $min;
}
Но здесь есть несколько более простых опций. Например, инициализируйте $min
до первого значения в массиве, затем сравните с остальными:
my $min = $array[0];
for my $i (1 .. $#array) {
$min = $array[$i] if $array[$i] < $min;
}
Или просто используйте встроенную функцию:
use List::Util 'min';
my $min = min @array;
Ответ 2
Чтобы ответить на вопрос, который вы действительно задали (даже если он вам не подходит):
-
Максимальное целочисленное значение, которое может быть сохранено как целое число со знаком.
say ~0 >> 1;
-
Наибольшее целочисленное значение, которое может быть сохранено как целое число без знака.
say ~0;
-
Все целочисленные значения от 0 до этого числа могут быть сохранены без потерь в виде числа с плавающей запятой.
use Config qw( %Config );
say eval($Config{nv_overflows_integers_at});
Обратите внимание, что некоторые большие целые числа могут быть сохранены без потерь в числе с плавающей запятой, но не на 1 больше, чем это.
Ответ 3
9**9**9
работает. Так что 0+'inf'
на многих версиях/платформах perl.
Ответ 4
Perl не является C; если вы попытаетесь вычислить слишком большое целое число, вместо этого вы получите результат с плавающей запятой (если вы не use bigint
, что делает целые числа неограниченными). Кроме того, вы получаете inf
.
Вы можете увидеть это с помощью Devel::Peek
, в котором показано внутреннее представление Perl значения:
$ perl -E 'use Devel::Peek; Dump(1000); Dump(1000**100); Dump(1000**100 + 1)'
SV = IV(0xcdf290) at 0xcdf2a0
REFCNT = 1
FLAGS = (PADTMP,IOK,READONLY,pIOK)
IV = 1000
SV = NV(0xd04f20) at 0xcdf258
REFCNT = 1
FLAGS = (PADTMP,NOK,READONLY,pNOK)
NV = 1e+300
SV = NV(0xd04f18) at 0xcdf228
REFCNT = 1
FLAGS = (PADTMP,NOK,READONLY,pNOK)
NV = 1e+300
IV
указывает целочисленное значение; NV
указывает значение с плавающей запятой (Number?).
Вы должны обязательно использовать инструмент, подходящий для вашей цели, вместо нечеткого взлома; List::Util::min
, как упоминалось в другом ответе, отлично. Просто подумал, что вам может понравиться подтверждение по вашему оригинальному вопросу:)
Ответ 5
Здесь: http://www.perlmonks.org/?node_id=718414
У меня есть ответ, который я могу проверить на linux 64
18,446,744,073,709,551,615 = (2 ^ 64) -1
Ответ 6
Самое большое целочисленное значение perl может хранить 9 007 199,254,740,992
Я не знаю, есть ли для этого константа.