275

私はこれが何をするのか調べましたがstrictfp、Javaでキーワードをいつ使用するかの例を実際に持っている人はいますか? 誰かが実際にこれの用途を見つけましたか?

すべての浮動小数点演算にそれを置くだけで副作用はありますか?

4

11 に答える 11

286

Strictfp を使用すると、すべてのプラットフォームで浮動小数点計算からまったく同じ結果が得られます。strictfp を使用しない場合、JVM 実装は、利用可能な追加の精度を自由に使用できます。

JLS から:

FP 厳密式内では、すべての中間値は float 値セットまたは double 値セットの要素でなければなりません。これは、すべての FP 厳密式の結果が、single および double 形式を使用して表現されたオペランドに対する IEEE 754 演算によって予測されたものでなければならないことを意味します。 . FP 厳密ではない式内では、実装が中間結果を表すために拡張指数範囲を使用するための余裕が認められます。大まかに言えば、実際の効果は、float 値セットまたは double 値セットを排他的に使用するとオーバーフローまたはアンダーフローが発生する可能性がある状況で、計算が「正しい答え」を生成する可能性があることです。

つまり、Write-Once-Run-Anywhereが実際にWrite-Once-Get-Equally-Wrong-Results-Everywhere を意味することを確認することです。

strictfp を使用すると、結果は移植可能になりますが、それがなければ正確である可能性が高くなります。

于 2009-02-05T21:23:27.957 に答える
67

実際には、strictfp に関する優れたウィキペディアの記事があり、 Java 仕様のFloating-Point Types, Formats, and Valuesに関するセクションへのリンクがあります。

行間を読むと、 を指定しない場合strictfp、JVM および JIT コンパイラは浮動小数点計算を必要に応じて計算するライセンスを持っていることを意味します。速度のために、計算をプロセッサに委任する可能性が高くなります。on の場合、計算は IEEE 754 算術標準に準拠する必要があります。これstrictfpは、実際には、おそらく JVM が計算を行うことを意味します。

では、なぜ を使いたいのでしょうstrictfpか? 私が見ることができるシナリオの 1 つは、基盤となるハードウェアや CPU が何であれ、すべての浮動小数点計算が決定論的である必要がある分散アプリケーション (またはマルチプレイヤー ゲーム) です。トレードオフは何ですか?おそらく実行時間。

于 2009-02-05T21:16:06.740 に答える
23

Java 17 アップデート

strictfpJava 17 の時点で、その機能が削除された非常に狭い一連のユースケースがありました。これはまだ有効な修飾子ですが、strictfp何もしません( JLS source )。

strictfp代わりに、 Java 1.2 で導入された以前の場合と同様に、すべての浮動小数点演算が厳密になりました。最新のプロセッサでは、余分なパフォーマンス コストはなくなりました。


元の答え

ここにいくつかの参考文献があります:

  • strictfp の使用(JDC Tech Tip)

  • jGuru: strictfp 修飾子は何のためのものですか? いつ使用を検討しますか?

    基本的には、コード内の浮動小数点式の結果が高速であるか、予測可能であるかを気にするかどうかにかかっています。たとえば、複数のプラットフォーム間で一貫性を保つために浮動小数点値を使用するコードで得られる答えが必要な場合は、 を使用しますstrictfp

  • strictfp - Java 用語集

    浮動小数点ハードウェアは、Java 仕様が要求するよりも精度が高く、値の範囲が広い計算を行います。一部のプラットフォームが他のプラットフォームよりも高い精度を提供すると、混乱を招きます。メソッドまたはクラスで修飾子を使用するstrictfpと、コンパイラは、すべてのプラットフォームで同じ結果を得るために、Java 仕様に厳密に準拠するコードを生成します。を使用しないstrictfpと、少し緩くなりますが、Pentium でガード ビットを使用して 80 ビットの精度を与えるほど緩くはありません。

  • そして最後に、実際の Java 言語仕様、§15.4 FP-strict Expressions :

    FP 厳密式内では、すべての中間値は float 値セットまたは double 値セットの要素でなければなりません。これは、すべての FP 厳密式の結果が、single および double 形式を使用して表現されたオペランドに対する IEEE 754 演算によって予測されたものでなければならないことを意味します。 . FP 厳密ではない式内では、実装が中間結果を表すために拡張指数範囲を使用するための余裕が認められます。大まかに言えば、実際の効果は、float 値セットまたは double 値セットを排他的に使用するとオーバーフローまたはアンダーフローが発生する可能性がある状況で、計算が「正しい答え」を生成する可能性があることです。

とはいえ、個人的に使ったことはありません。

于 2009-02-05T21:24:33.603 に答える
12

他の回答が述べたように、中間浮動小数点の結果がIEEE仕様に準拠します。特に x86 プロセッサは、IEEE 仕様とは異なる精度で中間結果を格納できます。JIT が特定の計算を最適化すると、状況はさらに複雑になります。命令の順序が毎回異なる可能性があり、その結果、丸めがわずかに異なります。

strictfp によって発生するオーバーヘッドは、プロセッサーと JIT に大きく依存する可能性があります。SSE2に関するこのウィキペディアの記事には、問題に対する洞察があるようです。したがって、JIT が SSE 命令を生成して計算を実行できる場合、strictfp にはオーバーヘッドがないように思われます。

私の現在のプロジェクトでは、strictfp を使用する場所がいくつかあります。潜在的な宇宙線をピクセル値から除去する必要があるポイントがあります。外部の研究者が同じピクセル値と宇宙線を目の前に持っている場合、彼らは私たちのソフトウェアと同じ結果の値を得るはずです。

于 2009-02-05T21:45:58.257 に答える
8
  • strictfp は、IEEE 754 に従って浮動小数点計算を制限する修飾子です。

  • これは、「public strictfp class StrictFpModifierExample{}」のようなクラス全体、またはメソッド「public strictfp void example()」で使用できます。クラスで使用する場合、すべてのメソッドは IEEE 754 に従い、メソッドで使用する場合、特定のメソッドはIEEE 754 に従います。

  • なぜそれが使用されるのですか??::: 異なるプラットフォームには異なる浮動小数点ハードウェアがあり、Java 仕様が必要とする値よりも高い精度と広い範囲の値で計算し、異なるプレートフォームで異なる出力を生成する可能性があるため、異なるプラットフォームに関係なく同じ出力を確認します。プラットフォーム

  • また、strictfp は、拡張精度浮動小数点演算の速度と精度を確実に活用します。

  • 浮動小数点計算を行うときに使用できるこのキーワードには、デメリットはありません。

  • 私の最後のポイントは -- IEEE754 とは何ですか IEEE 754 は、浮動小数点計算と浮動小数点値の格納の両方の標準メソッドを、シングル (32 ビット、Java 浮動小数点で使用) またはダブル (64 ビット、Java で使用) で定義します。また、中間計算と拡張精度形式の基準も定義します。

于 2012-09-19T19:09:14.547 に答える