1. 0 除算
JavaScript で 0 除算を行う場合、完全な 0 でなく限りなく 0 に近い値で割ったような扱いになります。
console.log(1 / 0);
console.log(1 / -0);
Infinity
-Infinity
参考「除算演算子 (/) - JavaScript | MDN」
2. 0 に近い値による除算
0
や -0
以外の値でも、割り算の結果が無限大になることがあります。
例えば、1 / Number.MIN_VALUE > Number.MAX_VALUE
かつ 1 / Number.MIN_VALUE > Number.MAX_SAFE_INTEGER
になります:
-
Number.MAX_VALUE
: $2^{1024} - 2^{971} = (2^{53} - 1) 2^{971}$ -
Number.MAX_SAFE_INTEGER
: $2^{53} - 1$ -
Number.MIN_VALUE
: $2^{-1074} \simeq 5 \times 10^{-324}$-
1 / Number.MIN_VALUE
: $2^{1074} \simeq 2 \times 10^{323}$
-
console.log(1 / Number.MIN_VALUE);
Infinity
参考「Number.MAX_VALUE - JavaScript | MDN」
参考「Number.MAX_SAFE_INTEGER - JavaScript | MDN」
参考「Number.MIN_VALUE - JavaScript | MDN」
3. 除算結果が無限大にならないようにする
3.1. Number.EPSILON
を用いる場合
1 / Number.EPSILON < Number.MAX_VALUE
かつ 1 / Number.EPSILON < Number.MAX_SAFE_INTEGER
を利用して、除算結果が無限大にならないようにすることが可能です:
-
Number.MAX_VALUE
: $2^{1024} - 2^{971} = (2^{53} - 1) 2^{971}$ -
Number.MAX_SAFE_INTEGER
: $2^{53} - 1$ -
Number.EPSILON
: $2^{-52}$-
1 / Number.EPSILON
: $2^{52}$
-
console.log(1 / Number.EPSILON);
console.log(100 / (100 * Number.EPSILON));
4503599627370496
4503599627370496
const f = (x, y) => console.log(x / y, y < x * Number.EPSILON);
f(1, 0);
f(1, -0);
f(1, Number.MIN_VALUE);
f(1, Number.EPSILON);
f(100, 100 * Number.EPSILON);
Infinity true
-Infinity true
Infinity true
4503599627370496 false
4503599627370496 false
参考「Number.MAX_VALUE - JavaScript | MDN」
参考「Number.MAX_SAFE_INTEGER - JavaScript | MDN」
参考「Number.EPSILON - JavaScript | MDN」
3.2. Number.isFinite()
を用いる場合
Number.isFinite()
を利用して除算結果が無限大でないことを直接確認することも可能です。
const f = x => console.log(x, Number.isFinite(x));
f(1 / 0);
f(1 / -0);
f(1 / Number.MIN_VALUE);
f(1 / Number.EPSILON);
f(100 / (100 * Number.EPSILON));
Infinity false
-Infinity false
Infinity false
4503599627370496 true
4503599627370496 true
参考「isFinite() - JavaScript | MDN」
4. 長整数 bigint
型の場合
長整数 bigint
型は 0 除算をしようとすると RangeError
が発生します。
整数のため、単に 0n
と比較することで 0 除算を防ぐことが可能です。
// console.log(100n / 0n);
console.log(0n === 0n);
true
参考「除算演算子 (/) - JavaScript | MDN」
参考「BigInt - JavaScript | MDN」