1

これは、クロスプラットフォームの一貫性と浮動小数点演算の決定論に関する質問です (IE は、異なる CPU/システムで異なる結果を生成します)

クロスプラットフォームの一貫性を維持する可能性が高いのはどれですか (疑似コード):

float myFloat = float ( myInteger) / float( 1024 )

また

float myFloat = float ( myInteger ) / float( 1000 )

プラットフォームは C# と AS3 です。

.

AS3 バージョン:

var myFloat:Number = myInteger  /  1000 // AS3
var myFloat:Number = myInteger  /  1024 // AS3

-わかりました、説明のために AS3 バージョンを追加しました。これは、上記の「C 疑似コード」と同等です。AS3 でわかるように、すべての計算は、整数であっても、自動的に Float として実行されます。キャストは必要ありません (また、キャストを回避したり、ランタイムに真の整数除算を実行させたりすることもできません)。フロートに: 私は違います! これは、ターゲット言語の 1 つで起こることです。

4

3 に答える 3

0

IEEE 754-1985 標準を読むことをお勧めします。コピーは 43 ドルで購入できます。2008 年版に取って代わられましたが、わずか 20 ページで非常に読みやすいため、浮動小数点の優れた入門書です。1000 と 1024 による除算の両方が決定論的である理由と、前者にはエラーがあり、後者にはエラーがない理由 (アンダーフローの場合を除く) を示します。また、与えられた答えと、なぜ間違った方向に進んでいるのかを理解するための基礎も与えてくれます。

于 2012-07-08T12:54:14.413 に答える
0

クロスプラットフォームの一貫性を維持する可能性が高いのはどれですか (疑似コード):

1024 による除算。すべての有限数に1024 による除算を適用するすべてのバイナリ ベースの浮動小数点システム (IEEE754、IBM、VAX、Cray)は、指定された表現で正確な結果を生成します。その理由は、1024 で割ると次のようになるからです。

  • ビットを右に 10 桁シフトします。つまり、
  • 2進指数を10減らす

数値が小さすぎる場合 (IEEE754 1E-38/1E-308 の場合)、正確な結果が失われますが、これは操作上の問題ではなく、数値の限られた範囲の問題です...単に表示できないだけですそのような小さな結果が正確に得られます。

丸めは必要ないため、丸めによる違いはありません (もちろん、ほとんどのプログラミング言語は偶数への丸めを使用しますが、別の丸めモードを選択できるものもあります)。

于 2012-07-08T14:05:01.830 に答える
0

最初のものは、表現の問題がないため、両方のプラットフォームで同じである可能性があります。特に小さい整数 (未使用の上位 8 ビット) の場合、1 つの正確な結果があり、この結果が使用される可能性が非常に高くなります。

しかし、私はそれに頼るつもりはありません。保証された決定論が必要な場合は、必要な演算をプレーンな整数の上に自分で実装することをお勧めします。たとえば、固定小数点表現を使用します。

2 つ目は、異なるハードウェアまたは .net バージョンで同じ C# コードを使用している場合でも、一貫性がない可能性があります。関連する質問を参照してください浮動小数点演算は C# で一貫していますか? それはできますか?

于 2012-07-08T11:40:21.253 に答える