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
    }
}

在此示例中,foo1似乎foo2返回相同的值。换句话说,当调用堆栈顶部的函数也具有修饰符时,调用堆栈顶部的函数是否具有 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 回答