【发布时间】:2021-10-08 14:46:42
【问题描述】:
【问题讨论】:
【问题讨论】:
从 Java 17 和 JEP 306 开始,您不会使用它:
使浮点运算始终保持严格,而不是同时具有严格的浮点语义 (
strictfp) 和略有不同的默认浮点语义。[T]SSE2(流 SIMD 扩展 2)扩展,大约在 2001 年开始在 Pentium 4 和更高版本的处理器中提供,可以以直接的方式支持严格的 JVM 浮点运算,而不会产生过多的开销。
由于 Intel 和 AMD 都长期支持 SSE2 和更高版本的扩展,这些扩展允许自然支持严格的浮点语义,因此具有不同于严格的默认浮点语义的技术动机不再存在。
另见JLS §8.4.3.5:
方法声明上的
strictfp修饰符已过时,不应在新代码中使用。它的存在与否对运行时没有影响。
从 Java 的最新 LTE 版本开始,语义上不再有任何差异,并且针对使用 strictfp 修饰符有一个新的编译器警告。
public class Strictly {
public strictfp double calc(double d1, double d2) {
return d1 * d2;
}
}
$ javac Strictly.java
Strictly.java:2: 警告:[strictfp] 从 17 版开始,所有浮点表达式都经过严格计算,不需要 'strictfp'
公共 strictfp 双计算(双 d1,双 d2){
^
1 个警告
【讨论】:
strictfp 会被弃用吗?
strictfp用于在处理浮点数时产生相同的结果,而与平台无关。
由于硬件的处理能力,不同平台上的精度可能会有所不同。所以它保证了代码在不同平台上执行时,输出不应该因为精度不同而被操纵。
一些优点是,
【讨论】: