Extrême valeurs numériques à virgule flottante de précision dans la R
Quelqu'un peut-il svp m'expliquer la sortie suivante. Je sais qu'il a quelque chose à faire avec précision en virgule flottante, mais de l'ordre de magnitue (différence 1e308) me surprend.
0: haute précision
> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
1: très imprécise
> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
Oui, c'est la R FAQ 7.31
En particulier, essayez de
Je ne pense pas que le “double” vous offre la même question à tous. L'OP n'a pas l'air de dire qu'ils sont surpris à propos de la valeur d'avoir à être représentés de la même façon mais à propos de la densité de représentable, numéros de près de 0 et de près de 1.
peut-être que vous avez raison et j'ai été trop sévère. je vais le laisser à Romain pour décider
tu veux dire Romain, l'utilisateur avec un insigne d'or qui vient de fermer la question sans lire les commentaires ou la recherche de la véritable double, si il ya en effet un? La question est en de bonnes mains.
En particulier, essayez de
options(digits = 22); x <- 1 - 1e-16; y <- 1 - 1e-17 == 1; print(y); print(x)
Je ne pense pas que le “double” vous offre la même question à tous. L'OP n'a pas l'air de dire qu'ils sont surpris à propos de la valeur d'avoir à être représentés de la même façon mais à propos de la densité de représentable, numéros de près de 0 et de près de 1.
peut-être que vous avez raison et j'ai été trop sévère. je vais le laisser à Romain pour décider
tu veux dire Romain, l'utilisateur avec un insigne d'or qui vient de fermer la question sans lire les commentaires ou la recherche de la véritable double, si il ya en effet un? La question est en de bonnes mains.
OriginalL'auteur AllYouCanEat86 | 2014-07-20
Vous devez vous connecter pour publier un commentaire.
R utilise la norme IEEE 754 double précision des nombres à virgule flottante.
Nombres à virgule flottante sont de plus en plus dense proche de zéro. C'est une conséquence de leur conçu pour calculer avec précision (l'équivalent d'environ 16 significative de chiffres après la virgule, comme vous l'avez remarqué) sur une très large gamme.
Peut-être que vous vous attendiez à un point fixe du système uniforme avec une précision absolue. Dans la pratique, à point fixe est soit le gaspillage ou les plages de chaque intermédiaire de calcul doit être évaluée soigneusement à l'avance, avec des conséquences dramatiques si elles sont mauvaises.
Positif nombres à virgule flottante ressembler à ceci, schématiquement:
La plus petite positive normal nombre double précision est de 2 à la puissance de l'exposant minimal. Près de l'un, le double-précision des nombres à virgule flottante sont déjà répartis assez écartés. Il y a une distance de 2-53 de l'un à le numéro ci-dessous, et à une distance de 2-52 de l'un à le nombre au-dessus d'elle.
1 - 1e-17
serait différente de1
si elle est favorable à 17 chiffres de précision.Je voulais faire comprendre qu'un certain nombre de chiffres décimaux était qu'une mesure approximative de la précision de calcul en virgule flottante binaire de toute façon, et s'est terminé en utilisant la fonction “équivalent” qui n'était pas assez fort. J'ai ajouté “à propos”.
Alors que nous sommes en coupant les cheveux en quatre, "de près de 16 chiffres" serait une description plus précise que "près de 17 chiffres". (2^53 est à environ 10^15.95).
OriginalL'auteur Pascal Cuoq
Comme par @PascalCuoq de réponse, parce que la FP de la précision d'un R double sur la norme IEEE 754-conformes à la plate-forme (par exemple, un x86) n'est pas tout à fait 16 chiffres décimaux:
Donc
1 - 1e-16
est déjà très proche ULP, et1 - 1e-17
est au-delà de pratiques de travail déloyales, et est arrondi à FP 1.0Voir le R de la documentation pour .Machine : "Caractéristiques Numériques de la Machine" . En particulier, regardez la différence entre EPS et de pratiques de travail déloyales.
(ULP est définie par rapport aux FP numéro 1. Le plus grand de votre FP nombre vieillit, plus la valeur du dernier bit, et le plus brut, un arrondissement opération)
Où la quantité 1e-323: vous êtes à la confusion ULP avec le minimum-représentable valeur FP, ce qui est beaucoup plus petit.
La minimum-représentable normalisé positive de la valeur FP a exposant e-308, comme par La norme IEEE 754 Double précision exemples ...
Mais nous pouvons obtenir un peu plus petit, si nous utilisons une UNnormalized FP nombre, c'est à dire que tous les bits de la mantisse sont 0. Donc comme vous l'avez découverts empiriquement, la minimum-représentable UNnormalized positive de la valeur FP était quelque part entre 1e-324 et 1e-323. C'est parce que nous avons 52 bits de mantisse, d'où la valeur numérique de la LSB est de 2^51 ou 10^15.35 plus petits:
(Pourquoi ne pouvons-nous pas empiriquement découvrir exactement? Parce que la norme IEEE-754 en interne porte une garde quelques chiffres avant arrondi)
(Note également le paramètre qui dit que la représentation en base 2:
.Machine$double.base = 2
)OriginalL'auteur smci