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

时间:2019-08-03 20:32:33

标签: java floating-point strictfp

更准确地说,如果在调用堆栈中存在带有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选择了不同的值怎么办?如果我选择正弦以外的浮点运算怎么办?

1 个答案:

答案 0 :(得分:6)

JLS 15.4

  

如果表达式不是常量表达式,请考虑所有包含该表达式的类声明,接口声明和方法声明。如果任何这样的声明带有strictfp修饰符(第8.1.1.3,§8.4.3.5,第9.1.1.2节),则表达式为 FP-strict

     

[...]

     

因此,当且仅当该表达式不是常量表达式并且不出现在具有strictfp修饰符的任何声明中时,该表达式才不是 FP-strict >

因此,对外部方法或其他获取浮点表达式的方法的调用不会“继承”调用堆栈中某些对象的FP-strictness。