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