This question already has answers here:
When should I use the “strictfp” keyword in java?

(9个答案)


3年前关闭。




我一直读过strictfp将浮点计算限制为IEEE-754标准,但从未读过为什么它们需要根据此标准来限制计算结果?

最佳答案

当James Gosling和他的团队开发Java时,优先考虑平台独立性。他们希望使Oak(Java)更好,以至于它可以在具有不同指令集的任何机器上完全相同地运行,甚至可以运行不同的操作系统。但是它们是浮点运算的问题,即,在计算浮点或双精度值时,由于精度不同,在不同的机器(32/64位处理器体系结构)上,运算结果是不同的。像当时的奔腾处理器一样,某些处理器是针对效率(快速计算)而构建的,而其余的则像当时的旧处理器一样,针对精度(准确的结果)。

由于为快速计算而苦苦挣扎的处理器对精度值进行了四舍五入,而其他处理器则没有,因此结果略有不同。这种差异与WORA的Java标语背道而驰。因此,Java人带来了修饰符strictfp,该修饰符将浮点算法的结果限制为IEEE-754标准。

Strictfp确保从每个平台上的浮点计算中获得完全相同的结果。如果我们不使用strictfp,那么JVM实现可以自由使用额外的精度。含义是,如果我们不指定strictfp,那么JVM和JIT编译器将获得许可,可根据需要进行浮点计算。为了提高速度,他们很可能会将计算委托给我们的处理器。但是启用strictfp后,计算必须符合IEEE 754算术标准,实际上,这很可能意味着JVM将进行计算,从而有可能在任何机器上获得相同的浮点算术结果。

10-07 12:39