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

2022-08-31 05:19:37

我已经查了一下这是做什么的,但是有没有人真正有一个例子来说明你什么时候会在Java中使用这个关键字?有没有人真正发现这个用途?strictfp

把它放在我所有的浮点运算上会有什么副作用吗?


答案 1

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

来自 JLS

在 FP 严格表达式中,所有中间值都必须是浮点值集或双精度值集的元素,这意味着所有 FP 严格表达式的结果必须是 IEEE 754 算术对使用单一和双精度格式表示的操作数预测的结果。在不严格 FP 的表达式中,为实现提供了一些余地,以使用扩展的指数范围来表示中间结果;粗略地说,净效应是,在排除使用浮点值集或双精度值集可能导致溢出或下溢的情况下,计算可能会产生“正确答案”。

换句话说,这是关于确保“一次运行一次”随处写入“实际上意味着”一次写入“,即”同样错误“”“结果”

使用strictfp,您的结果是便携式的,没有它,它们更有可能是准确的。


答案 2

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

在字里行间阅读,这意味着如果您不指定 ,那么 JVM 和 JIT 编译器就有权按照他们想要的方式计算浮点计算。为了速度,他们很可能会将计算委托给您的处理器。使用on时,计算必须符合IEEE 754算术标准,这在实践中可能意味着JVM将进行计算。strictfpstrictfp

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