更准确地说,如果在调用堆栈中存在带有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
选择了不同的值怎么办?如果我选择正弦以外的浮点运算怎么办?
答案 0 :(得分:6)
如果表达式不是常量表达式,请考虑所有包含该表达式的类声明,接口声明和方法声明。如果任何这样的声明带有
strictfp
修饰符(第8.1.1.3,§8.4.3.5,第9.1.1.2节),则表达式为 FP-strict 。[...]
因此,当且仅当该表达式不是常量表达式并且不出现在具有
>strictfp
修饰符的任何声明中时,该表达式才不是 FP-strict 。
因此,对外部方法或其他获取浮点表达式的方法的调用不会“继承”调用堆栈中某些对象的FP-strictness。