4

JavaScript で整数除算を行う必要がありますが、これでは倍精度浮動小数点数しか得られません。通常はただ実行Math.floor(a / b)(またはa / b | 0) して終了しますが、この場合はロックステップで実行されるシミュレーションを実行しており、64 ビットまたは 80 ビットの内部精度を使用しているかどうかに関係なく、マシンとランタイム全体で一貫性を確保する必要があります。

これまで矛盾に気づいたことはありませんが、それらが起こり得ないことを決定的に納得させることはできませんでした. だから私は疑問に思っています:

  1. とがそれぞれ 0..2^31-1 と 1..2^31-1 の範囲の整数であると仮定するaと、JavaScript からの結果(および) はマシンとランタイム間で一貫性があることが保証されますか?bMath.floor(a / b)a / b | 0

  2. なぜですか、そうでないのですか?

4

1 に答える 1

2

私の推測ではノーでしょう。その答えは、多くの要因に依存しているということです。

  1. ECMA スクリプトのブラウザー ベンダーの実装。

  2. ECMA スクリプトの特定のバージョンがそのレベルの一貫性を指定しているかどうか (通常はそうではありません)。

  3. あなたが気づいていないエンドユーザーのマシンのその他の外的要因。

浮動小数点演算は丸め誤差の影響を受けやすいことで知られています。小数点の右側まですべての数字が正確であると考えるのは良いことですが、非常に異なるハードウェアおよびソフトウェア構成を実行している 2 台のマシンで計算に同意することは、猫を飼うようなものです。

于 2011-05-31T18:50:19.873 に答える