web-dev-qa-db-ja.com

Javascriptは整数オーバーフローとアンダーフローを処理しますか?はいの場合、どのように?

Javaはアンダーフローとオーバーフローを処理しません ですが、Javascriptは整数に対してこれらをどのように処理しますか?

最小/最大に戻りますか?はいの場合、どの最小/最大ですか?

文字列を分割し、その文字に基づいてハッシュ値を計算する必要があります。

15

簡単なテストで、これを試してみると:

var max = Number.MAX_VALUE;
var x = max + 10;

var min = Number.MIN_VALUE;
var y = min / 10;

xmaxの値が同じであることがわかりました(ChromeではIEおよびFirefox))ので、一部のオーバーフローは最大値に固定されているようです。そして、y0に固定されるため、一部のアンダーフローはゼロになるようです。

ああ、でもそれはそれほど単純ではありません。すべてのオーバーフローがNumber.MAX_VALUEに送られるわけではなく、すべてのアンダーフローがNumber.MIN_VALUEに送られるわけでもありません。これを行う場合:

var max = Number.MAX_VALUE;
var z = max * 2;

すると、zInfinityになります。

それはあなたがどこまでオーバーフロー/アンダーフローするかに依存することがわかります。行きすぎると、代わりに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 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <span id="max"></span><br>
Number.MAX_VALUE + 10 = <span id="max10"></span><br>
<br>
Number.MIN_VALUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <span id="min"></span><br>
Number.MIN_VALUE / 10 = <span id="min10"></span><br>  
<br>
Number.MAX_VALUE * 2 &nbsp;= <span id="times2"></span><br>
22
jfriend00

最大値と最小値は+/- 9007199254740992

試してください this

alert([Number.MAX_VALUE, Number.MIN_VALUE]);

から ここ :-

大きさが2以下のすべての正および負の整数に注意してください53 数値型で表現できます(実際、整数0には+0と-0の2つの表現があります)。

これをテストします:-

var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
4
Rahul Tripathi