18

私はperlに不慣れで、で最も低い値を探しています@array。非常に大きな整数を表す定数はありますか?

配列を並べ替えて最初から始めることができることはわかっていますが、それは多くの無駄なCPUサイクルのようです。Perlでの私の問題に対するエレガントな解決策は何ですか?

4

6 に答える 6

30

あなたが実際に尋ねた質問に答えるには(実際には役に立ちませんが):

  1. 符号付き整数として格納できる最大の整数値。

    say ~0 >> 1;
    
  2. 符号なし整数として格納できる最大の整数値。

    say ~0;
    
  3. 0 からこの数値までのすべての整数値は、浮動小数点数として失われることなく格納できます。

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

    一部の大きな整数は浮動小数点数に損失なく格納できますが、これより 1 大きい整数は格納できないことに注意してください。

于 2013-02-28T10:58:09.740 に答える
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;
于 2013-02-28T05:30:16.387 に答える
4

9**9**9動作します。0+'inf'perl の多くのバージョン/プラットフォームでも同様です。

于 2013-02-28T05:34:29.687 に答える
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浮動小数点 (Number?) 値を示します。

あいまいなハックではなく、目的に適したツールを使用する必要があります。List::Util::min別の回答で述べたように、優れています。元の質問の確認が必要かもしれないと思っただけです:)

于 2013-02-28T05:47:11.530 に答える
-2

perl が保存できる最大の整数値は 9,007,199,254,740,992 です

そのための定数があるかどうかはわかりません。

于 2013-02-28T05:25:45.940 に答える