Java中的strictfp

Ism*_*ush 9 java floating-point strictfp

我正在java中实现一些神经网络库,并且存在密集double(非Double)矩阵运算,矩阵很大并且当然需要性能.

所以我开始阅读关于strictfp关键字我真的不明白它究竟做了什么,我正在寻找关于如果我应该使用它的简单解释以及为什么

Eri*_*rik 16

strictfp表示浮点计算应使用精确的IEEE754标准.如果没有strictfp,VM可以自由使用中间浮点和双精度值的其他(但取决于平台)表示,以提高精度.

如果您需要在多个平台上获得完全相同的结果,请使用strictfp.如果您想要当前平台可以提供的最佳精度,请避免使用它.

例如,在以下简单的添加中:

  2.0 + 1.1 + 3.0
Run Code Online (Sandbox Code Playgroud)

您是否希望将中间结果(例如2.0 + 1.1)表示为IEEE754标准的双倍,或者您的平台允许的最佳精度.strictfp确保第一个,而不是使用strictfp允许VM使用第二个替代方案.

使用strictfp不会损害性能,并且可能在本机浮点类型未映射到IEEE754的平台上提高性能,因为VM不需要在本机和IEEE754格式之间来回转换.答案取决于平台,您需要进行衡量.

  • `strictfp`和not reformance之间的差异可能是微不足道的,如果有的话,可能会在不同的平台上走向相反的方向.但是,如果你关心它 - 测试它两种方式并选择"更快"的方式. (3认同)
  • 值得一提的是,如果没有strictfp,溢出或下溢等情况可能会产生截然不同的结果 (2认同)