strictfp非访问修饰符有什么用?

时间:2010-01-06 17:25:56

标签: java strictfp

我知道这是一个重复的问题。但我想用一个例子来了解它。所以任何人都可以用一个例子来解释它吗?

链接到重复的帖子:When should I use the "strictfp" keyword in java?

3 个答案:

答案 0 :(得分:4)

嗯,girinie的答案总结得很好,但如果你正在寻找一个例子..

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

现在,让我们说你的游戏有一些物理可以改变游戏的结果(例如爆炸投掷随机碎片,可能会伤到你,如果碰到的话)。

该游戏的物理特性可能在服务器上有所不同(即使它只是略微)而不是客户端(例如,如果转换为整数进行碰撞检测,则将其舍入 down 而不是< EM>向上的)。在这样的边缘情况下,你可能会遇到客户端游戏没有被爆炸碎片击中的情况,但是服务器游戏 - 现在你有了分数差异,可能会错误地使高分提交无效

虽然strictfp肯定不是灵丹妙药,但在不同平台上强制实施“重播”指令的一致性方面还有很长的路要走。

答案 1 :(得分:1)

这是java language spec所说的:

  

在FP-strict表达式中,全部   中间值必须是元素   float值设置或double   价值集,暗示结果   必须是所有FP严格表达式   IEEE 754算法预测的那些   在使用单个表示的操作数上   和双格式。在一个   一些不是FP严格的表达式   余地被授予   实现使用扩展   要表示的指数范围   中间结果;净效应,   粗略地说,是一个   计算可能会产生“正确的   回答“在独家的情况下   使用浮点值设置或双精度   值集可能导致溢出或   下溢。

这意味着:Java中指定浮点运算(即涉及floatdouble类型的计算)以符合IEEE 754标准,该标准确切地说明了如何表示FP编号。问题是现代CPU在内部使用的FP算法不符合中间结果的标准 - 这通常不是问题,因为它实际上更快并且产生更精确的结果。但这可能意味着程序产生的结果略有不同,具体取决于它运行的硬件 - 这违背了Java平台独立性的基本承诺。

strictfp关键字允许您确保保留此承诺,并且程序将具有完全相同的结果,无论它在何处运行 - 但这是以降低硬件性能为代价的花费在所有中间结果上使FP计算更符合IEEE 754。

大多数情况下,您需要更好的性能,而不是保证跨平台的相同结果,这就是为什么strictfp行为是可选的。实际上,在JVM实现者意识到他们必须让CPU做额外的工作以遵守规范时,大多数时候这种严格的遵守没有优势,它在Java 1.4中是 make 可选的。

答案 2 :(得分:1)

strictfp非常特别。

让我们看一下航天局的例子

编写的代码使用非常具体的科学数字,现在这个数字是多位小数

这些小数值会影响太空船路径的轨迹,这受到我的常数影响,如摩擦力,重力,热量,湿度,接收的太阳射线,发电量,多重力体,速度,烟道效率。

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

但这并不是一个小差异,因为它会导致船舶偏离其轨迹,记住恭敬的微积分,每个小点都会产生轨迹,所以我们的计算必须非常具体和一致,即使是不同的平台,它必须具有标准和准确性。

对于此要求,我们在java中有strictfp。

你想要一个程序来演示它,很难用一个小程序准确地显示它