MAX_INT 的 Perl 等价物是什么?

问题描述 投票:0回答:7

我是 Perl 新手,正在寻找

@array
中的最低值。是否有某个常量代表一个非常大的整数?

我知道我可以对数组进行排序并从头开始,但这似乎浪费了很多 CPU 周期。对于我的 Perl 问题,有什么优雅的解决方案吗?

arrays perl constants built-in
7个回答
32
投票

回答您实际提出的问题(即使它对您来说并没有多大用处):

  1. 可以存储为有符号整数的最大整数值。

    say ~0 >> 1;
    
  2. 可以存储为无符号整数的最大整数值。

    say ~0;
    
  3. 从0到该数字的所有整数值都可以无损地存储为浮点数。

    use Config qw( %Config );
    say eval($Config{nv_overflows_integers_at});
    

    注意,一些较大的整数可以无损地存储在浮点数中,但不能是比这个大 1 的整数。


21
投票

一般情况下,您可以使用

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;

5
投票

9**9**9
有效。
0+'inf'
在 Perl 的许多版本/平台上也是如此。


2
投票

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
表示浮点(数字?)值。

您绝对应该使用适合您目的的工具,而不是模糊的黑客;另一个答案中提到的

List::Util::min
非常好。 只是觉得您可能想确认您原来的问题:)


0
投票

这里:http://www.perlmonks.org/?node_id=718414

我得到了一个可以在 linux 64 上验证的答案

18,446,744,073,709,551,615 = (2^64)-1


0
投票

解决正文,而不是标题,您只想:

use List::Util 'min';
...
my $lowest = min(@array);

即使您不想以简单的方式做到这一点,您也不需要为此设置最大数量,只需从任何元素开始即可:

my $lowest = $array[0];  # undef if array is empty
$lowest > $_ and $lowest = $_ for @array;

-2
投票

perl 可以存储的最大整数值是 9,007,199,254,740,992

我不知道是否有专门为此的常数。

© www.soinside.com 2019 - 2024. All rights reserved.