1. 序章

デフォルトでは、Javaの浮動小数点計算はプラットフォームに依存します。 したがって、浮動小数点の結果の精度は、使用中のハードウェアによって異なります。

このチュートリアルでは、 Javaでstrictfpを使用して、プラットフォームに依存しない浮動小数点計算を確実にする方法を学習します。

2. strictfp使用法

strictfp キーワードは、クラス、非抽象メソッド、またはインターフェイスの非アクセス修飾子として使用できます。

public strictfp class ScientificCalculator {
    ...
    
    public double sum(double value1, double value2) {
        return value1 + value2;
    }

    public double diff(double value1, double value2) { 
        return value1 - value2; 
    }
}

public strictfp void calculateMarksPercentage() {
    ...
}

public strictfp interface Circle {
    double computeArea(double radius);
}

strictfpを使用してインターフェイスまたはクラスを宣言すると、そのすべてのメンバーメソッドおよびその他のネストされた型は、そのの動作を継承します。

ただし、お願いします変数、コンストラクター、または抽象メソッドでstrictfpキーワードを使用することは許可されていないことに注意してください。

さらに、スーパークラスがマークされている場合、サブクラスはその動作を継承しません。

3. いつ使用しますか?

Java strictfp キーワードは、すべての浮動小数点計算の決定論的動作を重視する場合に便利です。

@Test
public void whenMethodOfstrictfpClassInvoked_thenIdenticalResultOnAllPlatforms() {
    ScientificCalculator calculator = new ScientificCalculator();
    double result = calculator.sum(23e10, 98e17);
    assertThat(result, is(9.800000230000001E18));

    result = calculator.diff(Double.MAX_VALUE, 1.56);
    assertThat(result, is(1.7976931348623157E308));
}

ScientificCalculator クラスはこのキーワードを使用するため、上記のテストケースはすべてのハードウェアプラットフォームで合格します。 を使用しない場合、JVMはターゲットプラットフォームハードウェアで利用可能な追加の精度を自由に使用できることに注意してください。

そのための一般的な実際のユースケースは、高感度の薬用計算を実行するシステムです。

4. 結論

このクイックチュートリアルでは、Javaでstrictfpキーワードをいつどのように使用するかについて説明しました。

いつものように、提示されたすべてのコードサンプルはGitHub利用できます。