什么时候应该在 java 中使用“strictfp”关键字?

新手上路,请多包涵

我已经查过它的作用,但实际上有没有人举例说明您何时会在 Java 中使用 strictfp 关键字?有没有人真的找到了这个用途?

将它放在我所有的浮点运算上会有任何副作用吗?

原文由 GBa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 452
2 个回答

Strictfp 确保您在每个平台上从浮点计算中获得完全相同的结果。如果您不使用 strictfp,JVM 实现可以自由使用可用的额外精度。

来自 JLS

在 FP-strict 表达式中,所有中间值必须是 float 值集或 double 值集的元素,这意味着所有 FP-strict 表达式的结果必须是 IEEE 754 算法对使用单精度和双精度格式表示的操作数预测的结果.在非 FP 严格的表达式中,允许实现使用扩展指数范围来表示中间结果的一些回旋余地;粗略地说,净效果是在独占使用浮点值集或双精度值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。

换句话说,它是关于确保 Write-Once-Run-Anywhere 实际上意味着 Write-Once-Get-Equally-Wrong-Results-Everywhere

使用 strictfp 你的结果是可移植的,没有它它们更可能是准确的。

原文由 Dan Dyer 发布,翻译遵循 CC BY-SA 2.5 许可协议

实际上, 维基百科上有一篇关于 strictfp 的好文章,其中包含指向 Java 规范中有关 浮点类型、格式和值 的部分 的链接。

从字里行间可以看出,如果您未指定 strictfp ,则 JVM 和 JIT 编译器有权根据需要进行浮点计算。为了提高速度,他们很可能会将计算委托给您的处理器。 strictfp 后,计算必须符合 IEEE 754 算术标准,这实际上可能意味着 JVM 将执行计算。

那么你为什么要使用 strictfp ?我可以看到的一个场景是在分布式应用程序(或多人游戏)中,无论底层硬件或 CPU 是什么,所有浮点计算都需要是确定性的。权衡取舍是什么?最有可能的执行时间。

原文由 MattK 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题