5

より正確には、strictfp 修飾子を持つ関数がコール スタックに存在する場合、コール スタックの一番上にある関数も strictfp 指定子に準拠しますか?

public class Main {

    // case 1: strictfp not present at top of call stack
    private static double bar1(double x) {
        return Math.sin(x);
    }

    strictfp private static double foo1(double x) {
        return bar1(x);
    }

    // case 2: strictfp present at top of call stack
    strictfp private static double bar2(double x) {
        return Math.sin(x);
    }

    strictfp private static double foo2(double x) {
        return bar2(x);
    }

    public static void main(String[] args) {
        double x = 10.0;
        System.out.println(foo1(x)); // -0.5440211108893698
        System.out.println(foo2(x)); // -0.5440211108893698
    }
}

この例では、foo1foo2が同じ値を返すように見えます。言い換えれば、コール スタックの一番上にある関数が strictfp 修飾子を持っているかどうかは、さらに下の関数にも修飾子がある場合、問題ではないように見えます。

これは常に当てはまりますか?に異なる値を選択するとどうなりますxか? 正弦以外の浮動小数点演算を選択するとどうなりますか?

4

1 に答える 1

6

JLS 15.4 :

式が定数式でない場合は、その式を含むすべてのクラス宣言、インターフェイス宣言、およびメソッド宣言を考慮してください。そのような宣言にstrictfp修飾子 (§8.1.1.3、§8.4.3.5、§9.1.1.2) が付いている場合、式はFP-strictです。

[...]

式が定数式ではなく、修飾子を持つ宣言内に現れない場合に限り、その式はFP 厳密ではありません。strictfp

したがって、外部メソッドへの呼び出し、または浮動小数点式を取得するその他の方法は、呼び出しスタックの上にある何かの FP 厳密性を「継承」しません。

于 2019-08-03T20:43:29.817 に答える