14

アーキテクチャやブラウザが異なると、同じ数学演算でも異なる結果が返されることがありますか?

4

4 に答える 4

15

他の答えは間違っています。ECMAScript 5.1 仕様によると(セクション 15.8.2)

注: 関数 acos、asin、atan、atan2、cos、exp、log、pow、sin、sqrt、および tan の動作は、対象の境界ケースを表す特定の引数値に対して特定の結果を要求する場合を除いて、ここでは正確に指定されていません。

...

アルゴリズムの選択は実装に任されていますが、Sun Microsystems が提供する自由に配布可能な数学ライブラリである fdlibm に含まれる IEEE 754 演算の近似アルゴリズムを実装で使用することをお勧めします (ただし、この標準では指定されていません)。


ただし、実装が指定されていたとしても、すべての浮動小数点演算の正確な結果は依然としてブラウザ/アーキテクチャに依存します。 これには、掛け算や割り算などの簡単な操作が含まれます!!

その理由は、IEEE-754 では、システムが結果よりも高い精度で 64 ビット浮動小数点計算を実行できるため、同じ精度を結果として使用するシステムとは異なる丸め結果になるためです。これはまさにx86 (Intel) アーキテクチャが行うことです。これが、C (および JavaScript) で、たとえ同じマシン上であってcos(x) != cos(y)も、時々実行できる理由です!x == y

これは、ネットワーク化されたピア ツー ピア ゲームの大きな問題です。これは、より高精度の計算を無効にできない場合 (C# の場合のように)、これらのゲームではほとんど浮動小数点計算を使用できないことを意味するためです。まったく。 ただし、Javascript ゲームは通常クライアント サーバーであるため、これは通常は問題になりません。

于 2012-04-26T17:14:10.080 に答える
3

すべてのブラウザー ベンダーがIEEE標準 + ECMA 仕様に従っており、実装中に人的エラーがないと仮定すると、違いはありません。

于 2012-04-26T13:48:34.563 に答える
1

ECMAScript 言語仕様 5.1 エディションでは、数値は IEEE 754 浮動小数点数に対応するプリミティブ値であると述べられていますが、これは計算が一貫していなければならないことを意味します。

http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf

4.3.19 数値

倍精度 64 ビット バイナリ形式の IEEE 754 値に対応するプリミティブ値

注 Number 値は Number 型のメンバーであり、数値を直接表現したものです。

BlueRaja指摘しているように、セクション 15.8.2 には一種の警告があります。

関数 acos、asin、atan、atan2、cos、exp、log、pow、sin、sqrt、および tan の動作は、ここでは正確に指定されていません...

つまり、これらは、数値に対する操作の結果が実装に依存し、したがって矛盾する可能性がある少なくともいくつかのケースです。

于 2012-04-26T13:52:15.657 に答える
0

私の 2 セント - @goldilocks のメモと他の人は、浮動小数点数で == または != を使用してはならないことをほのめかしています。では、「決定論的」とはどういう意味ですか? 動作が異なるマシンで常に同じであることは? 明らかに、これは「同じ動作」の意味に依存します。

まあ、「同じ」というばかげた文字通りのレベルでは、もちろんそうではありませんが、物理ビットは、たとえば 32 ビットと 64 ビットのマシンでは異なります。だからその解釈はアウトです。

では、プログラムは 2 つの異なるマシンで同じ出力で実行されるのでしょうか? 一般的な言語では、いいえ。C プログラムは、初期化されていないビットから読み取るなど、未定義のメモリで何かを実行できるためです。

では、有効なプログラムは、異なるマシンで同じことを行うでしょうか? つまり、浮動小数点数に対して == と != を使用するプログラムは、初期化されていないメモリを読み取るプログラムと同じくらい無効です。個人的には、Javascript 標準がフロートでの == および != の動作を打ち砕いて、風変わりではないにしても明確に定義されているかどうかはわかりません。そのため、それが正確な質問である場合は、他の回答を確認する必要があります。 . 標準に対して出力が定義されていない JavaScript コードを記述できますか? 標準を読まないでください(他の回答はこれを多少カバーしています)が、私の興味のために、これは議論の余地があります。

于 2012-04-26T22:33:17.913 に答える