タグ付けされた質問 「floating-point」

3
コンピュータが数学演算で同じ結果を得るようにするには、固定小数点を使用する必要がありますか?
最近のほとんどのコンピューターは同じ浮動小数点標準に従っていると言われましたが、これは、入力が同じであれば、指定された数学演算ですべて同じ浮動小数点数の答えが得られるということですか? 私はネットワーク上でRTSゲームを作成することを研究していて、何百ものユニットの位置を同期するのは悪い方法のように聞こえるので、私は尋ねます。 したがって、入力のみを送信する場合、すべてのクライアントがこれらの入力からシミュレーションを実行することで同じ結果が得られることを保証する必要があります。 古いRTSゲームでは固定小数点演算が使用されていたと読みましたが、すべてが同じ標準に準拠している場合、現代のコンピューターでもそれが必要かどうかわかりません。また、不正確ではありますが、浮動小数点の結果は同じ入力に対して確定的であるとも言われました(これは、同じ標準に従うすべてのコンピューターが同じ不正確な結果を取得することを意味します)。 同じ浮動小数点の基準に従っても、コンピューターに偏差がありますか? 私はこのゲームをC#で書いていますが、それが重要かどうかはわかりません。

2
`Vector <float> .Equals`は再帰的である必要がありますか、それともIEEE 754セマンティクスに従う必要がありますか?
浮動小数点値が等しいかどうかを比較する場合、2つの異なる方法があります。 NaN一致する、それ自体に等しくないIEEE 754仕様。 NaN等価関係の定義に不可欠な反射性の数学的特性を提供する、それ自体に等しい C#(にIEEE浮動小数点型に内蔵floatし、doubleIEEEのためのセマンティクス従う)==及び!=(等リレーショナル演算子&lt;)が、ための反射性を確保しobject.Equals、IEquatable&lt;T&gt;.Equals(およびCompareTo)。 ここで、float/の上にベクター構造体を提供するライブラリについて考えますdouble。このようなベクトル型は過負荷になり==/ !=およびオーバーライドobject.Equals/ IEquatable&lt;T&gt;.Equals。 何皆に同意すると、そのある==/ !=IEEEセマンティクスに従ってください。問題は、そのようなライブラリーがEquals再帰的な方法で、またはIEEEセマンティクスに一致する方法で(等価演算子とは別の)メソッドを実装するかどうかです。 のIEEEセマンティクスを使用するための引数Equals: IEEE 754に準拠 SIMD命令を利用できるため、(おそらくはるかに)高速です。 私は、スタックオーバーフローについて、SIMD命令を使用して再帰的等式をどのように表現するか、およびそれらのパフォーマンスへの影響について、別の質問をしました。浮動小数点の等値比較のためのSIMD命令 更新: 3つのSIMD命令を使用して効率的に再帰的等式を実装できるようです。 のドキュメントでEqualsは、浮動小数点を使用する場合に再帰性は必要ありません。 次のステートメントは、Equals(Object)メソッドのすべての実装に当てはまる必要があります。リストには、x、y、およびznullではないオブジェクト参照を表します。 x.Equals(x)true浮動小数点型を含む場合を除いて、を返します。ISO / IEC / IEEE 60559:2011、情報技術-マイクロプロセッサシステム-浮動小数点演算を参照してください。 floatを辞書のキーとして使用している場合は、罪の状態にあり、正常な動作を期待するべきではありません。 再帰的であるという主張: それはを含む既存のタイプと一致だSingle、Double、TupleとSystem.Numerics.Complex。 Equals再帰的ではなく、IEEEに従うBCLの前例は知りません。カウンターの例としてはSingle、Double、TupleとSystem.Numerics.Complex。 Equals主に、反射性に依存するコンテナと検索アルゴリズムで使用されます。これらのアルゴリズムでは、動作を妨げる場合、パフォーマンスの向上は重要ではありません。パフォーマンスの正確さを犠牲にしないでください。 これは、すべてのハッシュベースのセットや辞書、壊れるContains、Find、IndexOfさまざまなコレクション/ LINQ、セットベースのLINQの操作(上Union、Exceptデータが含まれている場合など)NaNの値を。 IEEEセマンティックが受け入れられる実際の計算を行うコードは、通常、具象型で機能し、==/ !=(またはより可能性の高いイプシロン比較)を使用します。 ジェネリック演算が必要なため、現在ジェネリックを使用して高性能計算を作成することはできませんが、これらはインターフェース/仮想メソッドを介して利用できません。 したがって、遅いEqualsメソッドはほとんどの高性能コードに影響を与えません。 IEEEセマンティクスが必要な場合、またはパフォーマンス上の利点が必要な場合に、IeeeEqualsメソッドまたはを提供するIeeeEqualityComparer&lt;T&gt;ことができます。 私の意見では、これらの議論は再帰的な実装を強く支持しています。 MicrosoftのCoreFXチームは、そのようなベクトル型を.NETに導入することを計画しています。私とは異なり、彼らは主にパフォーマンス上の利点のために、IEEEソリューションを好みます。このような決定は最終リリース後も変わらないので、大きな間違いだと私が信じていることについてコミュニティからフィードバックを得たいと思います。

1
unumはどのようにしてIEEEの負のゼロをエミュレートできますか?
私は現在、John Gustafson(Youtube)による「The End of Error-Unum Computing」を読んでいます。私がまだ確信がないのは、負の符号の付いたゼロによってIEEEで処理されたケースがunumでどのように処理されるかです。 したがって、最初に、unumは特定の正確な値(浮動小数点と同様)を表すことを許可し、さらに正確な値(正確な-∞と∞を含む)の間にある開いた間隔を表すことを許可します。したがって、完全な実数線は、正確な値と開いた間隔を交互に繰り返すことによって表されます。 -∞、(-∞、-maxreal)、-maxreal、... -smallsubnormal、(-smallsubnormal、0)、 0、 (0、smallsubnormal)、smallsubnormal、... maxreal、(maxreal、∞)、∞ このように、(IEEEの伝統では)アンダーフローやオーバーフローなどの例外的な値は、ほんの一部のオープンインターバルです。言い換えれば、これらの以前は特別な条件だったものが、今では通常のケースに変わります。 IEEEの-∞は、{-∞}と(-∞、-maxreal)の和集合に対応します。 そして、符号付きゼロは、間隔(-smallsubnormal、0)と(0、smallsubnormal)になる可能性があります。 ただし、1 /(-smallsubnormal、0)は(-∞、-maxreal)になり、-∞だけではなくなりました。一方、1/0は∞です。 これについて私がまだ躊躇しているのは、IEEE -0と+0で比較すると等しいことです。しかし、それらはunumにはありません。マッピングは100%ではないようです。だから、違いが現れるかもしれないコーナーケースがあるかどうか(そしてそれらのケースが本当に関連しているかどうか)? (私は、なぜ負のゼロが重要なのかを知っていますか?、 負の浮動小数点値の使用)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.