我知道这是一个重复的问题。但是我想以一个例子来知道。那么谁能以示例来解释它?

链接到重复帖子: 我什么时候应该在Java中使用“ strictfp”关键字?

有帮助吗?

解决方案

好吧,Girinie的答案总结得很好,但是如果您正在寻找一个例子。

假设您制作了一个允许高分提交的游戏,但仅在服务器验证分数之后。验证分数的一种方法是让客户端将按键(及其时间戳)发送到服务器。理想情况下,服务器将播放完全相同的游戏并获得相同的分数。

现在,假设您的游戏具有一些可以改变游戏结果的物理学(例如,爆炸扔掉随机碎片,如果撞击,可能会伤害您)。

该游戏的物理学可能在服务器上可能有所不同(即使仅略有)与客户端(例如,如果转换为整数进行碰撞检测,则将其四舍五入 代替 向上)。在这样的边缘情况下,您可能会有客户游戏的情况 不是 受到爆炸的碎屑的打击,但服务器游戏 曾是 - 现在您的分数有所不同,这可能会错误地使高度提交无效

尽管 strictfp 当然不是银色子弹,它在跨不同平台的“重播”说明的一致性方面有很长的路要走。

其他提示

这就是 Java语言规格 说:

在fp-strict表达式中,所有中间值必须是浮点值集或双值集的元素,这意味着所有fp-strict表达式的结果必须是IEEE 754算术在使用单一和双重格式的操作数上预测的元素。 。在不是fp-strict的表达式中,有一些余地被授予实现使用扩展指数范围来表示中间结果;大致说明,净效果是,在独家使用浮点值集或双值集可能会导致溢出或下流的情况下,计算可能会产生“正确的答案”。

这是什么意思:浮点算术(即计算涉及 floatdouble 类型)在Java中指定要遵守 IEEE 754 标准,它准确地说明了如何表示FP数字。问题在于,现代CPU在内部使用不符合该标准的中间结果的FP算术 - 这通常不是一个问题,因为它实际上既更快又产生更精确的结果。但这可能意味着一个程序会根据其运行的硬件而产生的结果略有不同 - 这违背了Java独立于平台的基本承诺。

strictfp 关键字允许您确保保留此诺言,并且该程序的结果将完全相同 - 但这是以在硬件上的较低性能为代价的,必须花费额外的努力来使FP计算对IEEE 754在所有中间结果上。

在大多数情况下,您会拥有更好的性能,而不是在平台之间保证相同的结果,这就是为什么 strictfp 行为是可选的。实际上是 制成 JAVA 1.4的可选JVM实施者意识到,当大多数情况下如此严格的依从性没有优势时,他们必须使CPU做出额外的工作来遵守规格。

严格FP非常特别。

让我们看看 航天代理人的例子.

书面代码使用非常具体的科学数字,现在此数字已在 多个小数.

这些 小数的价值影响轨迹 太空路径是由我的常数(例如摩擦,重力,热量,水分,太阳射线,产生的电力,多重引力体,速度,烟道效率)产生的。

要点是,当发送数据进行评估以跟踪船时, 应返回不同平台相同的值 否则,我们将收到十进制值略有不同的数据。

但这并不是很小的差异,因为这会导致船从其轨迹中转移,请记住递延的微积分,每个小点都会轨迹,所以我们 对于不同平台,计算必须非常具体且一致,它必须具有常规和精确的准确性。

为此,我们在Java中有严格的FPP。

您想要一个程序来证明它, 很难通过一个小程序准确地展示这一点.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top