Comment faire pour déterminer le max de précision pour le double
Je suis en train d'essayer de déterminer quel est le maximum de précision pour une chambre double. Dans les commentaires pour la accepté de réponse dans ce lien Conserver la précision avec double en Java @PeterLawrey états max de précision dans 15.
Comment déterminez-vous cela ?
Avez-vous regarder les lié wiki dans la double question? Java utilise la norme IEEE 754 à virgule flottante en double.
OriginalL'auteur Shivam Sinha | 2016-03-31
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas vraiment ce qu'il a déclaré à tous. Ce qu'il a dit était:
et il est mauvais. Ils ont 15 décimal chiffres de précision.
Le nombre de chiffres après la virgule dans un nombre quelconque est donnée par son journal à la base 10. 15 est la valeur plancher de log10(253-1), où 53 est le nombre de bits de la mantisse (y compris le bit implicite), comme décrit dans la Javadoc et IEEE 754, et 253-1 est donc le maximum de valeur de la mantisse. La valeur réelle est 15.954589770191003298111788092734 les limites de la calculatrice de Windows.
Il est tout à fait mal à la décrire comme "décimales de précision". Un
double
a 15 décimal chiffres de précision si ils sont tous avant le point décimal. Pour les nombres fractionnaires avec des pièces que vous pouvez obtenir beaucoup plus que 15 chiffres dans la représentation décimale, en raison de l'incommensurabilité de décimal et binaire des fractions.Le nombre de chiffres après la virgule dans un nombre quelconque est donnée par son journal à la base 10.
La "droite logarithme argument" ne s'applique qu'à des entiers, ce qui est peut-être ce que vous dites dans votre dernier paragraphe. Pour en virgule flottante que vous avez à faire une dérivation comme je le fais ici: exploringbinary.com/... . Pour les doubles-vous obtenir la même réponse (15); pour les chars, les log_10(2^24-1) est d'environ 7.22, mais le max de précision est de 6. (Voir aussi stackoverflow.com/questions/30688422/... .)
pourquoi est-ce le max de précision 6 et de ne pas & pour les flotteurs ?
Je pense que c'est expliqué dans les deux liens dans mon commentaire.
OriginalL'auteur user207421
Vous pouvez également la "mesure" directement:
L'idée de ce code est d'atteindre le plus petit nombre avec un seul bit. Vous commencez donc avec
1
(qui a seulement 1 bit) et de diviser par deux (ce qui décale les bits vers la droite en binaire) jusqu'à ce que vous atteignez le dernier bit. Le dernier numéro imprimé par cette boucle est:La plus petite valeur représentable dans un double n'a rien à voir avec le maximum de précision. L'un est une fonction de l'exposant de la largeur, de l'autre de la mantisse largeur.
OriginalL'auteur Maljam
D'exécuter ce code, et de voir où il s'arrête
Variable
y
devient la plus petite valeur différente de1.0
. Sur mon ordinateur (Mac Intel Core i5), il s'arrête à1.1102...E-16
. Il imprime ensuite la précision (en décimal et binaire).Comme indiqué dans https://en.wikipedia.org/wiki/Machine_epsilon, à virgule flottante de précision peut être estimée avec la valeur epsilon.
Il est "le plus petit nombre qui, ajouté à un, donne un résultat différent de l'un" (j'ai fait une petite variante: 1-e au lieu de 1+e, mais la logique est la même)
Je vais vous expliquer en décimal: si vous avez 4 décimales de précision, vous pouvez exprimer 1.0000 - 0.0001, mais vous ne pouvez pas exprimer le nombre 1.00000-0.00001 (vous manque de la 5ème décimale). Dans cet exemple, avec 4 décimales de précision, l'epsilon est de 0,0001. L'epsilon directement des mesures de la virgule flottante de précision. Juste transposer en binaire.
Modifier Votre question demande "Comment déterminer...". La réponse que vous avez été la recherche ont été plus d'une explication de plus qu'un moyen de déterminer la précision (avec la réponse vous l'avez accepté). De toute façon, pour d'autres, l'exécution de ce code sur une machine qui va déterminer la précision pour le "double" de type.
Il essaie de trouver la valeur epsilon, qui est lié à la virgule flottante de précision. Voir en.wikipedia.org/wiki/Machine_epsilon (regardez la binary64 ligne dans le tableau)
Il se pose au sujet de la virgule flottante de précision elle-même, pas l'epsilon, et il est spécifiquement poser des questions sur la valeur de 15, vous n'en avez pas la réponse à tout.
Je vais vous expliquer en décimal: si vous avez 4 décimales de précision, vous pouvez exprimer
1.0000 - 0.0001
, mais vous ne pouvez pas exprimer le nombre1.00000-0.00001
. Dans cet exemple, avec 4 décimales de précision, l'epsilon est de 0,0001. L'epsilon directement les mesures de la virgule flottante de précision. Juste transposer en binaire. (remarque: l'exposant de mon résultat est1.11E-16
dit que la précision est d'environ 15 chiffres)Vous devriez expliquer à tous que, dans votre réponse, mais le nombre de chiffres dans une fraction décimale vous dit exactement rien. Celui que vous avez imprimé a 17 chiffres après la virgule.
OriginalL'auteur Sci Prog
Le max de précision de
double
est la première valeur supérieure à 0. Selon le Double de la Javadoc, ce nombre est représenté parDouble.MIN_VALUE
. Vous pouvez de sortie comme suit:Voir ce programme IDEOne pour un exemple.
Vous confondez avec précision gamme, à l'instar de plusieurs autres réponses ici.
OriginalL'auteur entpnerd