严格遵守 IEEE 规范

默认情况下,floatdouble 上的浮点运算严格遵守 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;
        }
    }
}