strictfp は、 Java プログラミング言語における廃止された冗長な予約語です。 [ 1 ] [ 2 ]以前は、このキーワードは、移植性を確保するために浮動小数点演算をIEEE 754セマンティクスに制限する修飾子として使用されていました。strictfp キーワードは、 Java 仮想マシン(JVM) バージョン 1.2 で Java に導入され、JVM バージョン 17 でその機能が削除されました。 [ 2 ] Java 17 以降では、IEEE 754 セマンティクスが必須となっているため、このキーワードを使用しても効果はありません。
IEEE規格IEEE 754 は、浮動小数点計算と、単精度 (32 ビット、Java で使用float) または倍精度 (64 ビット、Java で使用)を含むさまざまな形式での浮動小数点値の格納の両方に対する標準的な方法をdouble規定しています。
一部のハードウェアでは、より高い精度やより広い指数範囲を提供する拡張精度フォーマットも提供されています。このようなアーキテクチャでは、中間結果をこのような拡張フォーマットを使用して計算する方が効率的な場合があります。これにより、本来発生するはずの丸め誤差、オーバーフロー、アンダーフローを回避できますが、プログラムがこのようなアーキテクチャで異なる出力を生成する可能性があります。従来のx87浮動小数点アーキテクチャを備えたx86マシンで拡張精度を使用しないことは、特にコストがかかりました。計算精度を制御することは容易でしたが、中間結果の指数範囲を制限するには、追加の高コスト命令が必要でした。
JVM 1.2より前は、浮動小数点演算は厳密である必要がありました。つまり、すべての中間浮動小数点結果は、IEEEの単精度または倍精度で表現されているかのように動作する必要がありました。そのため、一般的なx87ベースのハードウェアでは、必要な箇所でオーバーフローが発生するようにすることはコストがかかりました。
JVM 1.2以降、中間計算はデフォルトで、IEEE 32ビットおよび64ビット形式に関連付けられた標準指数範囲を超えることが許可されました。代わりに、「拡張指数」値セットのメンバーとして表現することが可能になりました。x87などのプラットフォームでは、オーバーフローやアンダーフローが想定どおりに発生しない可能性があり、結果として、より意味のある、しかし再現性の低い結果が得られる場合があります。
SSE2をサポートする x86 プロセッサでは x87 浮動小数点が不要になったため、Java 17 では再びすべての浮動小数点演算が厳密になり、事実上 1.2 以前のセマンティクスが復元されました。[ 2 ]
オーバーフローやアンダーフローが発生しない場合、strictfp の有無による結果の違いはありません。再現性が不可欠な場合は、strictfp 修飾子を使用して、すべてのプラットフォームでオーバーフローとアンダーフローが同じ場所で発生するようにすることができます。strictfp 修飾子がない場合、中間結果では指数範囲が広くなることがあります。[ 3 ]
このstrictfp修飾子は、以前のバージョンの JVM で行われていたように、すべての中間値を IEEE 単精度と倍精度の値として表現することによってこれを実現します。[ 4 ]
プログラマーは、この修飾子を使用することstrictfpで、以前のバージョンと同様に計算が実行されるようにすることができます。つまり、IEEEの単精度および倍精度型のみが使用されるようにします。strictfpを使用すると、浮動小数点計算の結果がすべてのプラットフォームで同一であることが保証されます。
クラス、インターフェース、および非抽象メソッドに使用できます。[ 5 ]メソッドに適用すると、メソッド内のすべての計算で厳密な浮動小数点演算が使用されます。クラスに適用すると、クラス内のすべての計算で厳密な浮動小数点演算が使用されます。コンパイル時の定数式は常に厳密な浮動小数点動作を使用する必要があります。[ 6 ]
例
public strictfp class MyFPclass { // ... ここにクラスの内容を記述 ... }