严格遵守 IEEE 规范
默认情况下,float
和 double
上的浮点运算不严格遵守 IEEE 754 规范的规则。允许表达式使用特定于实现的扩展来扩展这些值的范围; 基本上允许它们比要求更准确。
strictfp
禁用此行为。它应用于类,接口或方法,并应用于其中包含的所有内容,例如类,接口,方法,构造函数,变量初始值设定项等。使用 strictfp
时,浮点表达式的中间值必须在 float 值设置或 double 值设置。这导致这些表达式的结果正是 IEEE 754 规范预测的结果。
所有常量表达式都是隐式严格的,即使它们不在 strictfp
范围内。
因此,strictfp
的净效应有时会使某些极端情况计算不准确,并且还会使浮点运算变慢 (因为 CPU 现在正在做更多工作以确保任何本机额外精度不会影响结果)。但是,它也会导致所有平台上的结果完全相同。因此,它在诸如科学计划之类的事物中是有用的,其中再现性比速度更重要。
public class StrictFP { // No strictfp -> default lenient
public strictfp float strict(float input) {
return input * input / 3.4f; // Strictly adheres to the spec.
// May be less accurate and may be slower.
}
public float lenient(float input) {
return input * input / 3.4f; // Can sometimes be more accurate and faster,
// but results may not be reproducable.
}
public static final strictfp class Ops { // strictfp affects all enclosed entities
private StrictOps() {}
public static div(double dividend, double divisor) { // implicitly strictfp
return dividend / divisor;
}
}
}