嚴格遵守 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;
        }
    }
}