我已经查过它的作用,但是是否有人真正有一个何时使用的示例 strictfp Java 中的关键字?有没有人真正发现这个的用途?

将它放在我所有的浮点运算上会有任何副作用吗?

有帮助吗?

解决方案

Strictfp确保您得到正是从每一个平台上的浮点计算相同的结果。如果你不使用strictfp,JVM的实现可以自由使用额外的精度(如有)。

从JLS

  

在一个FP-严格表达,所有   中间值必须元素   设置的浮点值或双   值设置,这意味着该结果   所有FP-严格的表情一定是   那些由IEEE 754算术预测   对操作数使用单表示   双格式。内   表达不是FP-严格,一些   余地被授予了   实现使用扩展   指数范围来表示   中间结果;其净效应,   大致说来,是一个   计算可能会产生“正确的   回答”在情况下独占   使用浮点值集合或双   值集可能会导致溢出或   下溢。

在换句话说,它是关于确保写一次随处运行的的实际意义的写一次获取,同样,错误的结果,无处不在

使用strictfp你的结果是可移植的,没有它,他们更有可能是准确的。

其他提示

这一切都始于一个故事,

在Java是由詹姆斯·高斯林,赫伯特和他的团队的其他开发。他们脑子里有这个疯狂的东西叫做 平台无关。他们想做出的橡木(爪哇)的好多了,它会运行具有不同的指令集的任何机器上完全相同,甚至运行不同的操作系统。但是,有带小数点的数字也被称为浮点和编程语言的双重问题。有些机器内置了针对效率的同时,其余的人瞄准精度。所以,后来的(更精确的)机器有浮点的尺寸为80位,而前者(更有效/快)的机器有64个双打。但是,这是反对建立一个平台独立于语言的有核心思想。此外,当代码被编译一些机器(具有双64位的大小的)上,这可能导致精度/数据丢失和另一种机器的运行(具有双位80的大小)。

向上调整大小是可以容忍的,但减小尺寸是不可能的。 所以,他们遇到strictfp即的严格的浮点的概念即可。如果您使用该关键字与类/函数,那么它的浮点和双打有超过任何机器尺寸一致。即分别32/64位。

这里有几个参考:

  • 使用严格fp (JDC 技术提示)
  • j大师: strictfp 修饰符有什么用?我什么时候会考虑使用它?

    基本上,这一切都归结为您是否关心代码中浮点表达式的结果是快速的还是可预测的。例如,如果您需要代码给出的答案,其中使用浮点值在多个平台上保持一致,那么使用 strictfp.

  • strictfp - Java 术语表

    浮点硬件的计算精度更高,并且值范围比 Java 规范要求的更大。如果某些平台比其他平台提供更高的精度,那将会令人困惑。当您使用 strictfp 方法或类上的修饰符,编译器生成严格遵守 Java 规范的代码,以便在所有平台上获得相同的结果。没有 strictfp, 是稍微宽松一点,但还没有宽松到使用 Pentium 中的保护位来提供 80 位精度。

  • 最后是实际的 Java 语言规范, §15.4 FP 严格表达式:

    在 FP 严格表达式中,所有中间值必须是浮点值集或双精度值集的元素,这意味着所有 FP 严格表达式的结果必须是使用单精度和双精度格式表示的操作数上通过 IEEE 754 算术预测的结果。在非 FP 严格的表达式中,为使用扩展指数范围来表示中间结果的实现提供了一些余地;粗略地说,最终效果是,在独占使用浮点值集或双精度值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。

不过,我个人从未使用过它。

作为其他的答案中提到它引起中间浮点结果以符合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 还确保利用扩展精度浮点运算的速度和精度。

  • 当我们进行浮点计算时,我们可以使用这个关键字没有任何缺点

  • 我的最后一点是 - 短IEEEE 754中的IEEE754是什么是浮点计算的标准方法,并且在单个(32位,用于Java floats中使用)或double(64位,在Java中使用)中浮点值的存储双打)精度。它还定义了中间计算和扩展精度格式的规范。

strictfp是一个关键字,并且可以被用作用于类或方法(但从来没有变量)非非访问修饰符。标记一类作为strictfp意味着在类的任何方法代码将符合用于浮点IEEE 754标准的规则。

没有这种改性剂,在所述方法中使用的浮点的行为可能以依赖于平台的方式。有了它,你可以预测你的浮点将如何表现无论在JVM上运行的基础平台。的缺点是,如果底层平台能够支持更高的精度,一个strictfp方法将不能够利用它。

如果你不声明一个类为strictfp,你仍然可以得到的一个方法,通过方法的基础strictfp行为,通过声明一个方法strictfp

〜SCJPSun®Certified编程的Java™6 - 凯西塞拉利昂&伯特贝茨〜

下面的例子可能有助于更清楚地理解这一点:在java中,每当我们使用寻找任何操作的精确信息时,例如如果我们做 double num1 = 10e+102;双 num2 = 8e+10 ;结果=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.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top