我什么时候应该使用“strictfp” java中的关键字?

我已经了解了它的作用,但是有没有人真的有一个例子,说明何时在Java中使用
strictfp
关键字?有没有人真正找到了这个用途? 将它放在我的所有浮点运算上是否会产生任何副作用?     
已邀请:
Strictfp可确保您在每个平台上获得与浮点计算完全相同的结果。如果不使用strictfp,则JVM实现可以在可用时自由使用额外的精度。 来自JLS:   在FP-strict表达式中,全部   中间值必须是元素   浮点值集或双精度值   价值集,暗示结果   必须是所有FP严格表达式   IEEE 754算法预测的那些   在使用单个表示的操作数上   和双重格式。在一个   一些不是FP严格的表达式   余地被授予   实现使用扩展   要表示的指数范围   中间结果;净效应,   粗略地说,是一个   计算可能会产生“正确的   回答“在独家的情况下   使用float值set或double   值集可能导致溢出或   下溢。 换句话说,它是关于确保Write-Once-Run-Anywhere实际上意味着Write-Once-Get-Equally-Werong-Results-Everywhere。 使用strictfp,您的结果是可移植的,没有它,它们更可能是准确的。     
维基百科实际上有一篇关于这个主题的好文章,带有Java规范的链接。 读取行之间的含义是,如果不指定
strictfp
,则JVM和JIT编译器可以根据需要计算浮点计算的许可。为了速度,他们很可能会将计算委托给您的处理器。当
strictfp
开启时,计算必须符合IEEE 754算术标准,实际上,这可能意味着JVM将进行计算。 那你为什么要用
strictfp
?我可以看到的一个场景是在分布式应用程序(或多人游戏)中,无论底层硬件或CPU是什么,所有浮点计算都需要是确定性的。什么是权衡?最有可能是执行时间。     
以下是几个参考: 使用strictfp(JDC Tech Tip) jGuru:strictfp修饰符是什么?我什么时候考虑使用它?   基本上,这一切归结为你是否关心你的代码中的浮点表达式的结果是快速的还是可预测的。例如,如果您需要使用您的代码提出的答案,使用浮点值在多个平台上保持一致,那么请使用
strictfp
。 strictfp - Java词汇表   浮点硬件的计算精度更高,并且具有比Java规范要求的更大范围的值。如果某些平台比其他平台更精确,那将会令人困惑。在方法或类上使用
strictfp
修饰符时,编译器会生成严格遵守Java规范的代码,以便在所有平台上获得相同的结果。如果没有
strictfp
,它是否稍微宽松一点,但不要太宽松,以至于使用Pentium中的保护位来提供80位精度。 最后是实际的Java语言规范,§15.4FP严格表达式:   在FP-strict表达式中,所有中间值必须是浮点值集或双值集的元素,这意味着所有FP严格表达式的结果必须是IEEE 754算法在使用单格式和双格式表示的操作数上预测的结果。在不是FP-strict的表达式中,为实现授予了一些余地,以使用扩展指数范围来表示中间结果;粗略地说,净效应是在独占使用浮点值集或双值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。 不过,我个人从来没有使用它。     
一切都始于一个故事, 当James由James Gosling,Herbert和他的团队的其他成员开发时。他们把这个疯狂的东西称为平台独立性。他们希望使橡木(Java)更好,以至于在具有不同指令集的任何机器上运行完全相同,甚至运行不同的操作系统。但是,小数点数也存在问题,在编程语言中也称为浮点数和双精度数。一些机器的目标是效率,而休息的目标是准确性。因此,后来的(更准确的)机器的浮点大小为80位,而前者(更有效/更快)的机器有64位双倍。但是,这是建立一种独立于平台的语言的核心理念。此外,当在某台机器上构建代码(具有64位大小的两倍)并在另一种机器(具有80位大小的两倍)上运行时,这可能导致精度/数据丢失。 可以容忍Up-Sizing,但不能使用Down-Sizing。 因此,他们遇到了strictfp即严格浮点的概念。如果将此关键字与类/函数一起使用,则其浮点和双精度在任何计算机上都具有一致的大小。即分别为32/64位。     
正如其他答案所提到的,它会导致中间浮点结果符合IEEE规范。特别是x86处理器可以存储IEEE规范中具有不同精度的中间结果。当JIT优化特定计算时,情况变得更加复杂;每次指令可能不同的顺序导致略微不同的舍入。 由strictfp引起的开销可能非常依赖于处理器和JIT。 这篇关于SSE2的维基百科文章似乎对这个问题有了一些了解。 因此,如果JIT可以生成SSE指令来执行计算,那么strictfp似乎不会有任何开销。 在我目前的项目中有几个地方我使用strictfp。有一点需要从像素值中去除潜在的宇宙射线。如果一些外部研究人员在他们面前具有相同的像素值和宇宙射线,他们应该得到与我们的软件相同的结果值。     
strictfp是一个修饰符,它根据IEEE 754限制浮点计算。 这可以在整个类上使用,如“public strictfp class StrictFpModifierExample {}”或方法“public strictfp void example()”。如果它在类上使用,则所有方法都将遵循IEEE 754,如果在方法上使用,则特定方法将遵循IEEE 754。 为何使用?? ::: 由于不同的平台具有不同的浮点硬件,其计算的精度和范围都比java规范要求的更高,并且可能在不同的平板上产生不同的输出。因此无论不同的平板形式如何,它都能确认相同的输出 strictfp还确保利用扩展精度浮点运算的速度和精度。 我们在进行浮点计算时可以使用这个关键字没有缺点 我的最后一点是 - 简言之IEEE754 IEEE 754定义了浮点计算和浮点值存储的标准方法,包括单个(32位,用于Java浮点数)或双精度(64位,用于Java双精度)精度。它还定义了中间计算的规范并用于扩展精度格式。     
strictfp
是一个关键字,可以用作类或方法的非非访问修饰符(但绝不是变量)。将类标记为
strictfp
意味着类中的任何方法代码都符合浮点的IEEE 754标准规则。 如果没有该修饰符,方法中使用的浮点可能会以平台相关的方式运行。有了它,您可以预测浮点的行为,无论JVM运行的底层平台如何。缺点是如果底层平台能够支持更高的精度,那么
strictfp
方法将无法利用它。 如果你没有将一个类声明为
strictfp
,你仍然可以通过将方法声明为
strictfp
来逐个方法地获得
strictfp
行为。 ~SJJSun®认证程序员Java™6 - Kathy Sierra&伯特贝茨〜     
可能在下面的示例帮助理解这一点更清楚: 在java中,每当我们使用寻找任何操作的精确信息时,例如             如果我们做双倍num1 = 10e + 102; double num2 = 8e + 10;                 result = num1 + num2;
        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
    

要回复问题请先登录注册