これは重複した質問であることを知っています。しかし、私は例でそれを知りたいです。誰でも例を挙げて説明できますか?
重複投稿へのリンク: Java で「strictfp」キーワードを使用する必要があるのはいつですか?
これは重複した質問であることを知っています。しかし、私は例でそれを知りたいです。誰でも例を挙げて説明できますか?
重複投稿へのリンク: Java で「strictfp」キーワードを使用する必要があるのはいつですか?
さて、girinieの答えはそれをうまくまとめていますが、例を探しているなら..
サーバーがスコアを検証した後でのみ、ハイスコアの送信を許可するゲームを作成したとします。スコアを検証する1つの方法は、クライアントにキー押下(およびそのタイムスタンプ)をサーバーに送信させることです。理想的には、サーバーはまったく同じゲームをプレイし、同じスコアを取得します。
さて、あなたのゲームがゲームの結果を変えることができるいくつかの物理学を持っているとしましょう(例えば、それが当たった場合、あなたを傷つける可能性のあるランダムな破片を投げる爆発)。
そのゲームの物理特性は、サーバー上で(わずかであっても)クライアントとは異なる可能性があります(たとえば、衝突検出のために整数に変換する場合は、切り上げではなく切り捨てられます)。そのようなエッジケースでは、クライアントゲームが爆発の破片に見舞われなかったが、サーバーゲームは打撃を受けたという状況が発生する可能性があります。これでスコアに差が生じ、ハイスコアの送信が誤って無効になる可能性があります。
確かにstrictfp
特効薬ではありませんが、さまざまなプラットフォーム間で「再生」命令の一貫性を保つのに大いに役立ちます。
これは、Java言語仕様が言うことです:
FP 厳密式内では、すべての中間値は float 値セットまたは double 値セットの要素でなければなりません。これは、すべての FP 厳密式の結果が、single および double 形式を使用して表現されたオペランドに対する IEEE 754 演算によって予測されたものでなければならないことを意味します。 . FP 厳密ではない式内では、実装が中間結果を表すために拡張指数範囲を使用するための余裕が認められます。大まかに言えば、実際の効果は、float 値セットまたは double 値セットを排他的に使用するとオーバーフローまたはアンダーフローが発生する可能性がある状況で、計算が「正しい答え」を生成する可能性があることです。
つまり、Javaの浮動小数点演算 (float
および型を含む計算) は、 IEEE 754標準に準拠するように指定されています。問題は、最新の CPU が中間結果の標準に準拠していない FP 演算を内部的に使用していることです。これは、実際には高速であり、より正確な結果が得られるため、通常は問題になりません。しかし、それはプログラムが実行するハードウェアに応じて、プログラムが生成する結果がわずかに異なることを意味する可能性があります。これは、Java のプラットフォームに依存しないという基本的な約束に反しています。double
キーワードを使用すると、このstrictfp
約束が守られ、プログラムがどこで実行されてもまったく同じ結果になることを保証できますが、ハードウェアでのパフォーマンスが低下し、FP 計算を順守するために余分な労力を費やす必要があります。すべての中間結果でIEEE 754に。
ほとんどの場合、プラットフォーム間で同一の結果を保証するよりも、パフォーマンスを向上させたいと考えています。そのため、strictfp
動作はオプションです。実際、Java 1.4 では、JVM 実装者が仕様に準拠するために CPU に余分な作業を行わせる必要があることに気付いた後、Java 1.4 でオプションになりました。
strictfp は非常に特別です。
A space Agency の例で見てみましょう。
記述されたコードは、非常に特殊な科学数値を使用しています。現在、この数値は複数桁の 10 進数です。
これらの小数の値は、宇宙船の経路の軌道に影響を与えます。これは、摩擦、重力、熱、湿気、太陽光線の受信、生成される電気、複数の重力体、速度、煙道効率などの定数によって影響を受けます。
要点は、船を追跡するためにデータが評価のために送信されるとき、異なるプラットフォームで同じ値を返す必要があるということです。
しかし、これは小さな違いとは見なされません。船がその軌道から逸脱する結果になるためです。差分計算を覚えておいてください。各小さな点が軌道を作るので、私たちの計算は非常に具体的で、プラットフォームが異なっても一貫している必要があります。標準が必要です。そして精密な正確さ。
この要件のために、Java には strictfp があります。
プログラムでそれを実証したいのですが、小さなプログラムでこれを正確に示すのは難しいです。