Le modificateur strictfp permet de contrôler le comportement de la virgule flottante par rapport au standard IEEE 754 (Standard for Binary Floating-Point Arithmetic).
Le modificateur strictfp ne peut être appliqué qu'à :
Par défaut, les calculs sur les nombres de type double ou float sont effectués d'une façon non stricte dans une classe, une interface ou une méthode. Pour éviter cela, il suffit d'utiliser le modificateur strictfp dans leur déclaration.
strictfp class NomClasse {...} strictfp interface INomInterface {...} strictfp type méthode(){...}
L'entité déclarée avec le modificateur strictfp est alors dite FP-strict.
Si une classe est FP-strict, cela implique que ses méthodes sont également FP-strict.
Toutefois, le modificateur strictfp ne peut s'appliquer ni aux méthodes d'interfaces, ni aux constructeurs de classes.
Le modificateur strictfp permet de garantir les mêmes rendus de calculs, quelle que soit la machine virtuelle Java (JVM) sur laquelle l'opération est effectuée.
public strictfp class FPStrict { public static void main(String[] args){ double nb_double = 1e+307; System.out.println("nb_double = " + nb_double); System.out.println("32.0 * nb_double * 1.0 / 2.0 = " + 32.0 * nb_double * 1.0 / 2.0); // (((32.0 * nb_double) * 1.0) / 2.0)
// ((Infinity * 1.0) / 2.0)
// affiche Infinity en ignorant le reste du calcul
// pourtant l'expression est égale à 16 * nb_double
// soit 1.6e+308 System.out.println("32.0 / 2.0 * nb_double = " 32.0 / 2.0 * nb_double); // ((32.0 / 2.0) * nb_double)
// 16 * nb_double
// affiche 1.6e+308 } }
En principe, le modificateur strictfp devrait conraindre la JVM à évaluer la première expression de telle sorte qu'elle retourne une valeur identique à celle de la seconde expression.