java - 为什么 strictfp 会出现?

标签 java modifier strictfp

我一直读过strictfp将浮点计算限制为IEEE-754标准,但从未读过为什么需要根据该标准限制计算结果?

最佳答案

当 james gosling 和他的团队开发 java 时,平台独立性是首要任务。他们希望让 Oak(Java) 变得更好,使其在任何具有不同指令集的机器上运行完全相同,甚至运行不同的操作系统。但他们的问题是浮点运算,即当计算floatdouble值时,运算结果在不同的机器上是不同的(32/64位处理器架构) )由于精度。由于某些处理器是像当时的奔腾处理器一样以效率(快速计算)为目标而构建的,而其他处理器则像当时的旧处理器一样以准确性(准确的结果)为目标。

由于处理器努力实现快速计算,对精度值进行四舍五入,但其他处理器却没有,因此结果略有不同。而这种差异与java的口号WORA背道而驰。因此Java人们带来了修饰符strictfp,它将浮点运算的结果限制为IEEE-754标准。

Strictfp 确保我们在每个平台上从浮点计算中获得完全相同的结果。如果我们不使用 strictfp,JVM 实现可以在可用的情况下自由使用额外的精度。这意味着,如果我们不指定 strictfp,那么 JVMJIT 编译器就有权计算我们的浮点计算,但是它们想。为了提高速度,他们很可能会将计算委托(delegate)给我们的处理器。但是使用 strictfp on 时,计算必须符合 IEEE 754 算术标准,这在实践中可能意味着 JVM 将进行计算,从而可以得到在任何机器上浮点运算的结果相同。

关于java - 为什么 strictfp 会出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057761/

相关文章:

java - Jar文件和文件依赖

java - java中空间填充希尔伯特曲线的递归算法

java - 如何访问我正在定义的 java grpc 服务的请求元数据?

linux - 使用反引号/重音/波形符作为修饰键

android - 如何在不同模块中隐藏 Java 中 Kotlin 内部类的可见性?

c# - C#中的新修饰符

java - 如果不使用 strictfp,代码是否会以某种方式变得不兼容?

scala - Scala中没有strictfp-解决方法?

java - java中字符串常量池中两个字符串的连接

使用 strictfp 修饰符声明的 Java 类无法通过 Modifier.isStrict(int) 进行测试