3

JavaScript の数値は風変わりです。加算は結合的ではないことに気付きました:

(-9999999999999999 + 1) + 1 === -9999999999999999 + (1 + 1) // false!

可換性はどうですか?JavaScript の数値はありますab?

typeof a === 'number'
typeof b === 'number'
a + b !== b + a

trueすべて( を除く)と評価されNaNますか?

4

1 に答える 1

2

よく見ると、1-9999999999999999が-10000000000000000を返すことがわかります。これは、この操作の結果ではありません(-9999999999999998である必要があります)。浮動小数点の精度の限界に達しているところです。これを行うと同じ効果が見られます:0.0000000000000001+1と0.0000000000000002+1

したがって、ecmascript仕様では、数値は64​​ビット形式のIEEE754標準に従う必要があります。これは16桁の精度に相当します。これは正確にあなたの数のサイズです。

編集

可換性についてのあなたの質問に関して、ここに仕様が述べているものがあります:

無限大、ゼロ、NaNのいずれも含まれず、オペランドの符号が同じであるか、大きさが異なる残りのケースでは、合計が計算され、IEEE754を使用して最も近い表現可能な値に丸められます。モード。大きさが大きすぎて表現できない場合、操作はオーバーフローし、結果は適切な符号の無限大になります。ECMAScript言語では、IEEE754で定義されている段階的なアンダーフローのサポートが必要です。

したがって、合計が計算されてから丸められるため、常に可換である必要があります。その他の動作はブラウザのバグになります。

編集2

さらに明確に、仕様は明示的に述べています(セクション11.6.3):

加算は可換演算ですが、常に結合的であるとは限りません。

于 2013-01-27T21:54:51.197 に答える