Java 的 strictfp 修饰符是否通过函数调用应用?

Does Java's strictfp modifier apply through function calls?

更准确地说,如果调用堆栈中存在带有 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 看起来 return 是相同的值。换句话说,调用堆栈顶部的函数是否具有 strictfp 修饰符似乎并不重要,而更下方的函数也具有修饰符。

这总是成立的吗?如果我为 x 选择不同的值会怎样?如果我选择正弦以外的浮点运算怎么办?

JLS 15.4:

If an expression is not a constant expression, then consider all the class declarations, interface declarations, and method declarations that contain the expression. If any such declaration bears the strictfp modifier (§8.1.1.3, §8.4.3.5, §9.1.1.2), then the expression is FP-strict.

[...]

It follows that an expression is not FP-strict if and only if it is not a constant expression and it does not appear within any declaration that has the strictfp modifier.

因此,调用外部方法或其他获取浮点表达式的方法不会"inherit"调用堆栈中某些东西的 FP 严格性。