我知道这是一个重复的问题。但我想通过一个例子来了解它。那么任何人都可以用一个例子来解释它吗?
链接到重复的帖子:我什么时候应该在 java 中使用“strictfp”关键字?
我知道这是一个重复的问题。但我想通过一个例子来了解它。那么任何人都可以用一个例子来解释它吗?
链接到重复的帖子:我什么时候应该在 java 中使用“strictfp”关键字?
好吧,girinie 的回答很好地总结了它,但如果你正在寻找一个例子..
假设您制作了一个允许提交高分的游戏,但前提是服务器验证了分数。验证分数的一种方法是让客户端将按键(及其时间戳)发送到服务器。理想情况下,服务器将玩完全相同的游戏并获得相同的分数。
现在,假设你的游戏有一些物理特性可以改变游戏的结果(例如,爆炸会抛出随机碎片,如果它击中可能会伤害你)。
该游戏的物理特性可能在服务器上(即使只是略微不同)与客户端上的不同(例如,如果转换为整数进行碰撞检测,它会被舍入而不是向上)。在这样的边缘情况下,您可能会遇到客户端游戏没有被爆炸碎片击中的情况,但服务器游戏是- 现在您的分数有所不同,这可能会错误地使高分提交无效
虽然strictfp
肯定不是灵丹妙药,但它在跨不同平台强制“重播”指令的一致性方面大有帮助。
这就是java语言规范所说的:
在 FP-strict 表达式中,所有中间值必须是 float 值集或 double 值集的元素,这意味着所有 FP-strict 表达式的结果必须是 IEEE 754 算术对使用单双格式表示的操作数预测的结果. 在非 FP 严格的表达式中,允许实现使用扩展的指数范围来表示中间结果;粗略地说,最终效果是,在独占使用浮点值集或双精度值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。
这意味着:Java 中的浮点运算(即涉及float
和double
类型的计算)被指定为遵守IEEE 754标准,该标准准确地说明了如何表示 FP 数。问题是现代 CPU 内部使用的 FP 算法不遵守该标准以获得中间结果 - 这通常不是问题,因为它实际上既更快又产生更精确的结果。但这可能意味着程序根据运行的硬件产生略微不同的结果——这违背了 Java 平台独立性的基本承诺。
关键字允许您确保遵守此承诺,strictfp
并且程序将获得完全相同的结果,无论它在哪里运行 - 但这是以降低硬件性能为代价的,必须付出额外的努力才能使 FP 计算遵守所有中间结果符合 IEEE 754。
大多数时候,您宁愿获得更好的性能,而不是保证跨平台的相同结果,这就是为什么strictfp
行为是可选的。实际上,在 Java 1.4 中,当 JVM 实现者意识到他们必须让 CPU 做额外的工作来遵守规范时,它在 Java 1.4中成为可选的,而大多数时候这种严格的遵守没有任何优势。
strictfp 它非常特别。
让我们看看一个航天局的例子。
编写的代码使用了非常具体的科学数字,现在这个数字是多位小数。
这些小数值影响飞船路径的轨迹,它受我的常数影响,如摩擦力、重力、热量、水分、接收到的太阳射线、发电、多重引力体、速度、烟道效率。
要点是,当发送数据进行评估以跟踪船舶时,它应该返回不同平台的相同值,否则我们将收到十进制值略有不同的数据。
但这并不是小差异,因为它会导致船偏离它的轨迹,记住微积分,每个小点都构成轨迹,所以我们的计算必须非常具体和一致,即使是不同的平台,它必须有标准和精确的准确性。
对于这个要求,我们在 java 中有 strictfp。
你想要一个程序来演示它,用一个小程序很难准确地显示出来。