strictfp

维基百科,自由的百科全书
strictfp是Java编程语言中的一个修饰符,它限制浮点计算以确保可移植性。strictfp命令是使用Java虚拟机(JVM)1.2版引入Java的,可用于所有当前更新的Java VM。

内容

1 基础
2 它是如何工作的
3 用法
4 参考文献

基础

的IEEE标准IEEE 754规定了两个浮点计算并且以各种格式,包括单(32位,在Java的使用浮点值的存储的标准方法float)或双(64位,在Java的使用double)的精度。

某些硬件还提供扩展的精度格式,可提供更高的精度和/或更大的指数范围。在这样的体系结构上,使用这种扩展格式计算中间结果可能更有效。这可以避免可能发生的舍入错误,溢出和下溢,但是可能导致程序在这样的体系结构上产生不同的输出。在传统的x87浮点架构的x86机器上避免使用扩展精度是特别昂贵的。尽管控制计算精度很容易,但限制中间结果的指数范围需要额外的昂贵指令。

在JVM 1.2之前,浮点计算要求严格; 也就是说,所有中间浮点结果都需要表现为使用IEEE单精度或双精度表示。这使得在常见的基于x87的硬件上成本很高,以确保在需要时可能发生溢出。

从JVM 1.2开始,默认情况下,中间计算允许超过与IEEE 32位和64位格式相关的标准指数范围。它们可以代表为“扩展指数”值集的成员。在像x87这样的平台上,溢出和下溢可能不会发生在预期的位置,从而产生可能更有意义但更不可重复的结果。

由于Java实现不再广泛使用x87浮点,因此有一个主动提议再次使所有浮点运算严格,有效地恢复1.2之前的语义。[1]

它是如何工作的

在没有溢出或下溢的情况下,有或没有strictfp的结果没有差异。如果重复性是必要的,则strictfp修饰符可用于确保在所有平台上的相同位置发生溢出和下溢。如果没有strictfp修饰符,中间结果可能会使用更大的指数范围。[2]

该strictfp修改由代表所有的中间值作为IEEE单精度和双精度值,如发生在早期版本的JVM实现这一目的。[3]

用法

程序员可以使用修饰符strictfp来确保按照早期版本执行计算; 也就是说,仅使用IEEE单精度和双精度类型。使用strictfp可确保浮点计算的结果在所有平台上都相同。

它可以用于类,接口和非抽象方法。[4]当应用于方法时,它会导致方法内的所有计算都使用严格的浮点数学。应用于类时,类中的所有计算都使用严格的浮点数学。编译时常量表达式必须始终使用严格的浮点行为。[5]

例子

public strictfp class MyFPclass { 
    // ... contents of class here ...
}