Quelle est la gamme inclusive de float et double en Java?
Pourquoi ne vous est-il pas recommandé d'utiliser float ou double pour quoi que ce soit où la précision est critique?
La classe Double
de Java a des membres contenant la valeur Min et Max pour le type.
2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.
Vérifiez Min_VALUE
et MAX_VALUE
membres finaux statiques de Double
.
(certains) Les gens vont suggérer de ne pas utiliser les types à virgule flottante pour les choses où l'exactitude et la précision sont essentielles parce que les erreurs d'arrondi peuvent perturber les calculs par de (petites) quantités mesurables.
Types de données primitifs de Java
booléen: 1 bit. Peut prendre uniquement les valeurs vrai et faux.
octet: 1 octet signé (complément à deux). Couvre les valeurs de -128 à 127.
court: 2 octets, signé (complément à deux), -32 768 à 32 767
int: 4 octets, signé (complément à deux). -2 147 483 648 à 2 147 483 647.
long: 8 octets signés (complément à deux). De -9.223.372.036.854.775.808 à +9.223.372.036.854.775.807.
float: 4 octets, IEEE 754. Couvre une plage de 1,40129846432481707e-45 à 3,40282346638528860e + 38 (positif ou négatif).
double: 8 octets IEEE 754. Couvre une plage de 4,94065645841246544e-324d à 1,79769313486231570e + 308d (positif ou négatif).
char: 2 octets, non signé, Unicode, 0 à 65 535
Les nombres à virgule flottante binaire ont des caractéristiques de précision intéressantes, car la valeur est stockée sous la forme d'un entier binaire élevé à une puissance binaire. Lorsqu'il s'agit de valeurs sous-entières (c'est-à-dire des valeurs comprises entre 0 et 1), les puissances négatives de deux "arrondissent" très différemment des puissances négatives de dix.
Par exemple, le nombre 0,1 peut être représenté par 1 x 10-1, mais il n'y a pas de combinaison d'exposant de base 2 et de mantisse pouvant représenter avec précision 0,1 - le plus proche que vous obtenez est 0,0000000000000001.
Donc, si vous avez une application où vous travaillez beaucoup avec des valeurs comme 0,1 ou 0,01, mais où de petites erreurs (moins de 0,00000000000000001%) ne peuvent pas être tolérées, les nombres binaires à virgule flottante ne sont pas pour vous.
Inversement, si des puissances de dix ne sont pas "spéciales" à votre application (les puissances de dix sont importantes dans les calculs de devises, mais pas dans, disons, la plupart des applications de la physique), alors vous êtes en fait mieux en utilisant le virgule flottante binaire, car il est généralement au moins un ordre de grandeur plus rapide, et il est beaucoup plus efficace en mémoire.
L'article de la documentation Python sur problèmes et limitations en virgule flottante fait un excellent travail pour expliquer ce problème sous une forme facile à comprendre. Wikipedia a également un bon article sur virgule flottante qui explique les mathématiques derrière la représentation.
De Types de données primitifs :
float:
Le type de donnéesfloat
est un point flottant IEEE 754 32 bits simple précision. Sa plage de valeurs dépasse le cadre de cette discussion, mais est spécifiée dans la section 4.2. de la spécification du langage Java. Comme pour les recommandations pourbyte
etshort
, utilisez unfloat
(au lieu dedouble
) si vous devez économiser de la mémoire dans de grands tableaux de nombres à virgule flottante. Ce type de données ne doit jamais être utilisé pour des valeurs précises, telles que la devise. Pour cela, vous devrez utiliser la classe Java.math.BigDecimal à la place. Numbers and Strings couvreBigDecimal
et d'autres classes utiles fournies par la plate-forme Java.
double
: le type de donnéesdouble
est un virgule flottante IEEE 754 64 bits double précision. Sa plage de valeurs dépasse le cadre de cette discussion, mais est spécifiée dans la section 4.2. de la spécification de langage Java. Pour les valeurs décimales, ce type de données est généralement le choix par défaut. Comme mentionné ci-dessus, ce type de données ne doit jamais être utilisé pour des valeurs précises, telles que la devise.
Pour la plage de valeurs, voir la section 4.2.3 Types à virgule flottante, formats et valeurs du JLS.
Bien sûr, vous pouvez utiliser des flottants ou des doubles pour des choses "critiques" ... De nombreuses applications ne font que croquer les nombres en utilisant ces types de données.
Vous avez peut-être mal compris certaines des diverses mises en garde concernant les nombres à virgule flottante, comme la recommandation de ne jamais comparer pour une égalité exacte , et ainsi de suite.