Java Language Adhésion stricte à la spécification IEEE


Exemple

Par défaut, les opérations à virgule flottante sur float et double ne respectent pas strictement les règles de la spécification IEEE 754. Une expression est autorisée à utiliser des extensions spécifiques à l'implémentation pour la plage de ces valeurs; leur permettant essentiellement d'être plus précis que nécessaire.

strictfp désactive ce comportement. Il est appliqué à une classe, une interface ou une méthode et s'applique à tout ce qui y est contenu, comme les classes, interfaces, méthodes, constructeurs, initialiseurs de variables, etc. Avec strictfp , les valeurs intermédiaires d'une expression à virgule flottante doivent être comprises entre l'ensemble de valeurs flottantes ou l'ensemble de valeurs doubles. Les résultats de ces expressions sont donc exactement ceux prévus par la spécification IEEE 754.

Toutes les expressions constantes sont implicitement strictes, même si elles ne sont pas strictfp dans une portée strictfp .

Par conséquent, strictfp a pour effet net de parfois faire certains calculs coin cas moins précis, et peut également plus lent opérations en virgule flottante (comme la CPU est en train de faire plus de travail pour assurer une précision supplémentaire native ne modifie pas le résultat). Cependant, les résultats sont également identiques sur toutes les plates-formes. Il est donc utile dans des choses comme les programmes scientifiques, où la reproductibilité est plus importante que la vitesse.

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;
        }
    }
}