Что такое 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

Я не знаю, есть ли для этого константа.