Java strictfp非访问修饰符的用途是什么?

Java strictfp非访问修饰符的用途是什么?,java,strictfp,Java,Strictfp,我知道这是一个重复的问题。但我想用一个例子来说明。那么有人能用一个例子来解释吗 重复帖子的链接:好吧,吉里尼的回答很好地概括了这一点,但如果你想找个例子的话 假设您制作了一个允许高分提交的游戏,但只有在服务器验证分数之后。验证分数的一种方法是让客户端将按键(及其时间戳)发送到服务器。理想情况下,服务器将进行完全相同的游戏并获得相同的分数 现在,让我们假设您的游戏具有一些可以改变游戏结果的物理特性(例如,如果发生爆炸,随机投掷碎片,可能会伤害您) 该游戏的物理特性在服务器上可能与客户端不同(即使只

我知道这是一个重复的问题。但我想用一个例子来说明。那么有人能用一个例子来解释吗


重复帖子的链接:

好吧,吉里尼的回答很好地概括了这一点,但如果你想找个例子的话

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

现在,让我们假设您的游戏具有一些可以改变游戏结果的物理特性(例如,如果发生爆炸,随机投掷碎片,可能会伤害您)

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

虽然strictfp肯定不是一颗灵丹妙药,但它在跨不同平台实现“重放”指令的一致性方面有很大的帮助。

这就是:

在FP严格表达式中,所有 中间值必须是元素 浮点值集或双精度浮点值集的 值集,这意味着 所有FP严格表达式的 ieee754算法预测的结果 关于使用单参数表示的操作数 和双格式。在一年之内 非FP严格的表达式,某些 对一个问题给予了回旋余地 使用扩展的 要表示的指数范围 中间结果;净效应,, 粗略地说,这是一个错误吗 计算可能会产生“正确的结果” 回答“在排他性的情况下 使用浮点值集或双精度浮点值集 值集可能导致溢出或错误 下溢

这意味着:Java中的浮点运算(即涉及
float
double
类型的计算)是根据标准指定的,该标准准确地说明了如何表示FP数。问题是现代CPU内部使用的FP算法不符合中间结果的标准-这通常不是问题,因为它实际上速度更快,结果更精确。但这可能意味着一个程序根据它运行在哪个硬件上产生的结果略有不同——这与Java平台独立性的基本承诺背道而驰

strictfp
关键字允许您确保遵守这一承诺,并且无论在何处运行,程序都将获得完全相同的结果-但这是以硬件性能较低为代价的,必须花费额外的精力使FP计算在所有中间结果上都符合IEEE 754


大多数情况下,您会获得更好的性能,而不是跨平台保证相同的结果,这就是为什么
strictfp
行为是可选的。事实上,在Java 1.4中,当JVM实现者意识到他们必须让CPU做额外的工作以符合规范时,这种严格的遵循在大多数情况下没有任何好处。

strictfp这是非常特殊的

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

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

这些小数影响太空船路径的轨迹,这受我的常数影响,例如摩擦、重力、热量、湿度、接收到的太阳光线、发电、多重重力体、速度和效率

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

但这并不是一个小的差别,因为它会导致船偏离轨道,记住微分微积分,每个小点都要做轨迹,所以我们的<强>计算必须是非常具体和一致的,对于不同的平台,它必须具有标准和精度。>/P> 对于此需求,我们有java中的strictfp。


你需要一个程序来演示它,用一个小程序很难准确地演示这一点

对不起,马特,我没听清你想说的话。你能用一些简单的例子来解释一下吗?我在最后一段之前添加了一些细节,如果还不清楚,请告诉我。请编辑文章并链接到副本。什么例子?代码?想象一下,有一个类/方法带有这个修饰符。。就这些。你还必须了解“引擎盖下”到底发生了什么。这不能用“简单的代码示例”来完成。@GuruKulki,请参阅