JavaScript の数値は風変わりです。加算は結合的ではないことに気付きました:
(-9999999999999999 + 1) + 1 === -9999999999999999 + (1 + 1) // false!
可換性はどうですか?JavaScript の数値はありますa
かb
?
typeof a === 'number'
typeof b === 'number'
a + b !== b + a
true
すべて( を除く)と評価されNaN
ますか?
JavaScript の数値は風変わりです。加算は結合的ではないことに気付きました:
(-9999999999999999 + 1) + 1 === -9999999999999999 + (1 + 1) // false!
可換性はどうですか?JavaScript の数値はありますa
かb
?
typeof a === 'number'
typeof b === 'number'
a + b !== b + a
true
すべて( を除く)と評価されNaN
ますか?
よく見ると、1-9999999999999999が-10000000000000000を返すことがわかります。これは、この操作の結果ではありません(-9999999999999998である必要があります)。浮動小数点の精度の限界に達しているところです。これを行うと同じ効果が見られます:0.0000000000000001+1と0.0000000000000002+1
したがって、ecmascript仕様では、数値は64ビット形式のIEEE754標準に従う必要があります。これは16桁の精度に相当します。これは正確にあなたの数のサイズです。
編集
可換性についてのあなたの質問に関して、ここに仕様が述べているものがあります:
無限大、ゼロ、NaNのいずれも含まれず、オペランドの符号が同じであるか、大きさが異なる残りのケースでは、合計が計算され、IEEE754を使用して最も近い表現可能な値に丸められます。モード。大きさが大きすぎて表現できない場合、操作はオーバーフローし、結果は適切な符号の無限大になります。ECMAScript言語では、IEEE754で定義されている段階的なアンダーフローのサポートが必要です。
したがって、合計が計算されてから丸められるため、常に可換である必要があります。その他の動作はブラウザのバグになります。
編集2
さらに明確に、仕様は明示的に述べています(セクション11.6.3):
加算は可換演算ですが、常に結合的であるとは限りません。