Javaはアンダーフローとオーバーフローを処理しません ですが、Javascriptは整数に対してこれらをどのように処理しますか?
最小/最大に戻りますか?はいの場合、どの最小/最大ですか?
文字列を分割し、その文字に基づいてハッシュ値を計算する必要があります。
簡単なテストで、これを試してみると:
var max = Number.MAX_VALUE;
var x = max + 10;
var min = Number.MIN_VALUE;
var y = min / 10;
x
とmax
の値が同じであることがわかりました(ChromeではIEおよびFirefox))ので、一部のオーバーフローは最大値に固定されているようです。そして、y
は0
に固定されるため、一部のアンダーフローはゼロになるようです。
ああ、でもそれはそれほど単純ではありません。すべてのオーバーフローがNumber.MAX_VALUE
に送られるわけではなく、すべてのアンダーフローがNumber.MIN_VALUE
に送られるわけでもありません。これを行う場合:
var max = Number.MAX_VALUE;
var z = max * 2;
すると、z
はInfinity
になります。
それはあなたがどこまでオーバーフロー/アンダーフローするかに依存することがわかります。行きすぎると、代わりにINFINITYが表示されます。これは、最大値が無限大よりも近いと見なすことができるIEEE754ラウンドツーニアレストモードを使用しているためです。詳細については、 Number.MAX_VALUEへの追加 を参照してください。その答えによると、1.7976931348623158×10の値308 以上を無限大に丸めます。 Number.MAX_VALUEとそれの間の値は、Number.MAX_VALUEに丸められます。
さらに複雑にするために、Javascriptがサポートする段階的なアンダーフローのようなものもあります。これは、浮動小数点値の仮数に先行ゼロがある場所です。漸進的なアンダーフローにより、浮動小数点は、それなしでは表現できないいくつかの小さな数値を表現できますが、精度は低下します。
制限がどこにあるかを正確に確認できます。
>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity
これは、どのブラウザでも試すことができる実行可能なスニペットです。
var max = Number.MAX_VALUE;
var x = max + 10;
var min = Number.MIN_VALUE;
var y = min / 10;
var z = max * 2;
document.getElementById("max").innerHTML = max;
document.getElementById("max10").innerHTML = x;
document.getElementById("min").innerHTML = min;
document.getElementById("min10").innerHTML = y;
document.getElementById("times2").innerHTML = z;
body {
font-family: "Courier New";
white-space:nowrap;
}
Number.MAX_VALUE = <span id="max"></span><br>
Number.MAX_VALUE + 10 = <span id="max10"></span><br>
<br>
Number.MIN_VALUE = <span id="min"></span><br>
Number.MIN_VALUE / 10 = <span id="min10"></span><br>
<br>
Number.MAX_VALUE * 2 = <span id="times2"></span><br>