問題タブ [strictfp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java strictfp 修飾子は最新の CPU に影響を与えますか?
strictfp
JLSによると、メソッド(およびクラス)の修飾子の意味を知っています:
strictfp 修飾子の効果は、メソッド本体内のすべての float または double 式を明示的に FP-strict にすることです (§15.4)。
FP 厳密式内では、すべての中間値は float 値セットまたは double 値セットの要素でなければなりません。これは、すべての FP 厳密式の結果が、single および double 形式を使用して表現されたオペランドに対する IEEE 754 演算によって予測されたものでなければならないことを意味します。 .
FP 厳密ではない式内では、実装が中間結果を表すために拡張指数範囲を使用するための余裕が認められます。大まかに言えば、実際の効果は、float 値セットまたは double 値セットを排他的に使用するとオーバーフローまたはアンダーフローが発生する可能性がある状況で、計算が「正しい答え」を生成する可能性があることです。
strictfp
メソッド内の式とそうでない式の間の実際の違いを取得する方法を考え出そうとしていstrictfp
ます。Intel Core i3 CPU と Intel Core i7 CPU を搭載した 2 台のラップトップでこれを試しました。そして、私は違いを得ることができません。
多くの投稿は、 を使用しないネイティブ浮動strictfp
小数点数が 80 ビット浮動小数点数を使用している可能性があり、可能な限り最小の Java double (ゼロに最も近い) よりも下、または可能な限り最大の 64 ビット Java double よりも上に余分な表現可能な数値があることを示唆しています。
以下のコードをstrictfp
修飾子の有無にかかわらず試してみましたが、まったく同じ結果が得られました。
実際には、コードがアセンブリにコンパイルされた場合にのみ違いが現れると想定しているため、-Xcomp
JVM 引数を使用して実行しています。しかし違いはありません。
HotSpot によって生成されたアセンブリ コードを取得する方法を説明する別の投稿を見つけました ( OpenJDK ドキュメント)。でコードを実行していますjava -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
。修飾子を含む最初の式 ( v * 1.0000001 / 1.0000001
) と、strictfp
修飾子を含まない同じ式は、次のようにコンパイルされます。
そのコードには、私が予想していたように、各ステップの結果を 64 ビットに切り捨てるものは何もありません。、およびの ドキュメントを調べると、これらの (SSE) 命令は、予想した 80 ビット値ではなく、64 ビット浮動小数点値で動作することがすべて言及されています。したがって、これらの命令が動作する double 値セットがすでに IEEE 754 値セットであることは論理的に思われるため、それがある場合とない場合に違いはありません。movsd
mulsd
divsd
strictfp
私の質問は次のとおりです。
- この分析は正しいですか?私は Intel アセンブリをあまり使用しないので、結論に自信がありません。
strictfp
修飾子を使用する操作と使用しない操作に違いがある (他の) 最新の CPU アーキテクチャ (JVM を含む) はありますか?
java - Java の % 演算子がオーバーフローすることはありますか?
C および C++ では、 Shafik の投稿INT_MIN % -1
によると、 の動作は未定義 / プラットフォームに依存するようです。
Java では、% 演算子がオーバーフローすることはありますか?
次のコードを検討してください。
上記の結果がプラットフォームに依存しないという保証はあり0
ますか?
java - strictfp クラスのアクセスレベルはデフォルトクラスと同じですか?
異なるパッケージに以下の 2 つのクラスがあります。
もちろん、public にするとスーパークラスにアクセスできますが、strictfp にすると (サポートされるアクセス レベルを知るためだけに)、以下のエラーが発生します。
タイプ SuperClass は表示されません。
では、 strictfpはdefaultと同じアクセス レベルを持っていると言えますか?
これが私が読んだスクリーンショットです。
java - Eclipse が enum 内で strictfp を宣言するように求めているのはなぜですか?
Javaで列挙型を試していました。以下のクラスを書くと、
コンパイラは言う:Syntax error on token String, strictfp expected.
私は知っているstrictfp
が、それはここに来ますか?
java - Strictfp は、異なるシステムでは異なる結果を返します
Windows 8 (Intel Atom Z3775) で次の方法を使用しています。
それは私に与える:1.80000592E8
実行時
私は得る: 1.8000059E8
なぜそれらは異なるのですか?strictfp を間違って使用していますか?
java - インターフェイス/クラスの実装/拡張による strictfp キーワードの動作
JLS strictfp インターフェイスでは、次のことが指定されています。
strictfp 修飾子の効果は、インターフェイス宣言内のすべての float または double 式を明示的に FP-strict にすることです (§15.4)。
これは、インターフェイスで宣言されたすべてのネストされた型が暗黙的に strictfp であることを意味します。
JLS strictfp クラス:
strictfp 修飾子の効果は、インターフェイス宣言内のすべての float または double 式を明示的に FP-strict にすることです (§15.4)。
これは、インターフェイスで宣言されたすべてのメソッド、およびインターフェイスで宣言されたすべてのネストされた型が暗黙的に strictfp であることを意味します。
これらの 2 つの段落からは、修飾子strictfp
で宣言されたインターフェイス/クラスを実装/拡張している間の動作の兆候はありません。strictfp
strictfp
検索した後、キーワードUse the strictfp modifier for floating-point scaling across platformsの使用法に関する適切な説明が見つかりました。
厳密な動作は、FP 厳密なスーパークラスを拡張するサブクラスには継承されません。オーバーライドされたメソッドがそうでない場合、オーバーライドするメソッドは独立して FP 厳密であることを選択できます。
strictfp
キーワードで宣言されたクラスを拡張しているときにキーワードの動作をテストしましたがstrictfp
、それは本当です:strictfp
動作はクラスを拡張するクラスによって継承されませんが、問題はstrictfp
キーワードで宣言されたインターフェイスを実装しているときに正しくありません:strictfp
動作は実装するクラスによって継承されませんインターフェイス。
修飾子strictfp
で宣言されたインターフェイス/クラスを実装/拡張する際の正しい動作を誰かが説明してくれますか?strictfp
java - なぜstrictfpが誕生したのですか?
strictfpは浮動小数点計算をIEEE-754標準に制限することを常に読んできましたが、この標準に従って計算結果を制限する必要が生じた理由を読んだことはありませんか?