HOWTO · JavaScript
JavaScript の NEGATIVE_INFINITY
この記事は、JavaScript の NEGATIVE_INFINITY 値を理解するのに役立ちます。
このページの内容
JavaScript では、負の無限大を -Infinity と表します。名前付き定数は Number.NEGATIVE_INFINITY です。識別子 NEGATIVE_INFINITY だけでは JavaScript のグローバル変数ではありません。この値はすべての有限数より小さいものの、最小の有限数ではありません。JavaScript の数値範囲には下限となる有限値がありません。絶対値が最大の有限値は Number.MAX_VALUE で、-Number.MAX_VALUE も有限値です。
JavaScript における負の無限大とは
JavaScript は IEEE 754 の倍精度浮動小数点数形式を使います。Number の値には正と負の無限大、有限値、NaN が含まれます。負の無限大は -Number.MAX_VALUE を含むすべての有限数より小さく、厳密等価比較では自分自身と等しくなります。一方、NaN は自分自身を含むどの値とも等しくないため、負の無限大と同じものではありません。
標準プロパティ Number.NEGATIVE_INFINITY は、表示上 -Infinity となる数値を返します。NEGATIVE_INFINITY という表記は説明文では使えますが、JavaScript コードでは Number. を付ける必要があります。無限大は例外ではなく数値なので、計算で生成されてもエラーはスローされません。
負の無限大を生成する方法
有限の負の値を正のゼロで割ると、負の無限大になります。また、有限の負の計算結果が絶対値の大きさゆえに表現できない場合も、オーバーフローによって負の無限大になります。たとえば、-Number.MAX_VALUE に 2 を掛けると -Infinity にオーバーフローします。一方、-Number.MAX_VALUE 単独では有限値のままです。
次の例を実行してください。
このセクションのコードと表示されるラベルや出力は英語のままです。
const value = -10 / 0;
console.log(value);
-Infinity
有限値のうち絶対値が最大の負の値に 2 を掛けても、オーバーフローして負の無限大になります。
const overflow = -Number.MAX_VALUE * 2;
console.log(overflow);
結果は -Infinity です。一方、-Number.MAX_VALUE 単独では有限値のままです。
符号付きゼロは除算結果の符号に影響します。有限の負の値を +0 で割ると -Infinity になり、-0 で割ると Infinity になります。計算式では意図を明確に表しにくい場合は、名前付き定数を直接使うこともできます。
const lowerBound = Number.NEGATIVE_INFINITY;
この宣言は構文を示すためのもので、出力はありません。特に、Number.NEGATIVE_INFINITY は組み込みの Number オブジェクトのプロパティであり、宣言が必要な変数ではありません。
負の無限大を比較・判定する方法
この値そのものを特定する必要がある場合は、厳密等価比較で直接判定できます。値がしきい値以下かどうかを調べるには、大小比較が便利です。Number.isFinite を使うと、すべての有限数を正負の無限大および NaN から区別できます。
この例が表示する判定ラベルは英語のままです。出力では、-Number.MAX_VALUE が finite、負の無限大が negative infinity と示されます。
function describeNumber(value) {
if (value === Number.NEGATIVE_INFINITY) return "negative infinity";
if (Number.isFinite(value)) return "finite";
return "another non-finite value";
}
console.log(describeNumber(-Number.MAX_VALUE));
console.log(describeNumber(-10 / 0));
finite
negative infinity
この例では、絶対値の大きい有限の負の値を負の無限大と区別し、正の無限大と NaN は別の結果としてまとめます。value < 0 だけで判定するのは避けてください。通常の有限な負の数にもこの条件が当てはまります。また、Number.isFinite(value) だけでは、どの非有限値なのかを特定できません。その区別が必要なら、Number.NEGATIVE_INFINITY と比較します。
算術演算の動作と特殊なケース
負の無限大に正の有限数を掛けると、結果は負の無限大のままです。負の有限数を掛けると、結果は正の無限大になります。正の有限数で割っても符号は変わらず、負の有限数で割ると符号が変わります。負の無限大に有限値を足しても、有限値を引いても、結果は負の無限大です。
組み合わせによっては無限大になりません。正の無限大と負の無限大を足す場合、どちらかの無限大にゼロを掛ける場合、または無限大を無限大で割る場合、結果は NaN になります。符号付きゼロによる除算では、両方のオペランドの符号に応じて結果が決まります。計算結果を後続の比較に使う場合は、これらの規則が重要です。NaN はどちらの無限大とも異なる動作をし、NaN を含む大小比較はすべて偽になります。
同じ符号の規則は有限値のオーバーフローにも当てはまります。数学上の結果が表現可能な範囲を超える演算では、その結果の符号に応じた無限大が返されることがあります。これは数値の結果であり、例外がスローされるわけではありません。そのため、オーバーフローを拒否する必要があるコードでは、たとえば Number.isFinite を使って結果を明示的に確認してください。
実用例と制限
最大値を検索するときは、すべての有限候補が負の無限大より大きいため、負の無限大を初期値にできます。ただし、コレクションが空なら結果は -Infinity のままです。その結果が呼び出し側にとって意味を持つか、空の入力を別途報告すべきかを決めてください。簡単な最大値検索の例を示します。
このセクションのコードと表示されるラベルや出力は英語のままです。
function maximum(values) {
let result = Number.NEGATIVE_INFINITY;
for (const value of values) {
if (value > result) result = value;
}
return result;
}
この方法は、入力が数値であり、空の反復可能オブジェクトに対して -Infinity を返しても問題ないことを前提とします。入力に NaN が含まれる可能性がある場合、NaN との比較は偽になるため、アプリケーションの方針に従って値を検証または除外してください。
負の無限大を一般的なエラー通知として使わないでください。これは正当な数値の結果なので、追加の取り決めがなければ、呼び出し側がエラーと計算結果を区別できないことがあります。また、最小値検索の初期値にも適しません。負の無限大より小さい有限候補は存在しないためです。最小値検索では通常、Infinity を初期値にするか、最初の有効な要素を使い、空入力の場合の扱いを明示します。合計や平均の初期値にも適しません。有限値を加えても結果は -Infinity のままで、その後の計算結果に影響します。