私はperlに不慣れで、で最も低い値を探しています@array
。非常に大きな整数を表す定数はありますか?
配列を並べ替えて最初から始めることができることはわかっていますが、それは多くの無駄なCPUサイクルのようです。Perlでの私の問題に対するエレガントな解決策は何ですか?
あなたが実際に尋ねた質問に答えるには(実際には役に立ちませんが):
符号付き整数として格納できる最大の整数値。
say ~0 >> 1;
符号なし整数として格納できる最大の整数値。
say ~0;
0 からこの数値までのすべての整数値は、浮動小数点数として失われることなく格納できます。
use Config qw( %Config );
say eval($Config{nv_overflows_integers_at});
一部の大きな整数は浮動小数点数に損失なく格納できますが、これより 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;
9**9**9
動作します。0+'inf'
perl の多くのバージョン/プラットフォームでも同様です。
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
別の回答で述べたように、優れています。元の質問の確認が必要かもしれないと思っただけです:)
perl が保存できる最大の整数値は 9,007,199,254,740,992 です
そのための定数があるかどうかはわかりません。