Quand utiliser DBL_EPSILON/epsilon
La DBL_EPSILON/std::numeric_limits::epsilon va me donner la plus petite valeur qui fera la différence lors de l'ajout d'un.
Je vais avoir du mal à comprendre comment appliquer ces connaissances dans quelque chose d'utile.
L'epsilon est beaucoup plus grande que la plus petite valeur de l'ordinateur peut traiter, de sorte qu'Il pourrait sembler comme une supposition correcte qu'il est sécuritaire d'utiliser des valeurs plus petites que epsilon?
Si le ratio entre les valeurs que je travaille avec être inférieure à 1/epsilon ?
OriginalL'auteur monkeyking | 2010-06-24
Vous devez vous connecter pour publier un commentaire.
La définition de DBL_EPSILON n'est-ce pas. C'est la différence entre la prochaine nombre représentable après 1 et 1 (votre définition suppose que le mode d'arrondi est réglé sur "0" ou "vers moins l'infini", qui n'est pas toujours vrai).
C'est quelque chose d'utile si vous en savez assez sur l'analyse numérique. Mais je crains que ce lieu n'est pas le meilleur pour apprendre à ce sujet. Comme un exemple, vous pourriez l'utiliser dans la construction d'une fonction de comparaison qui permettrait de dire si deux nombres à virgule flottante sont approximativement égaux comme ce
(mais sans savoir comment déterminer ulp, vous serez perdus; et cette fonction a probablement des problèmes si les résultats intermédiaires sont denormals; fp calcul est compliqué de faire robuste)
approximately_equal
ne va pas fonctionner correctement pour de très grandes valeurs, puisque la taille de l'intervalle de temps entre les cours et la suivante la plus proche valeur représentable dans un double des changements de magnitude (car l'exposant de changements). Faire cela de manière appropriée aurait besoin de recalculer un contexte précis epsilon basé sur la valeur de l'objet de la comparaison.multipliant epsilon par
max(fabs)
devrait donner la valeur exacte, et l'ulp argument permettre de donner le contexte de l'erreur relative déjà accumulé. Si vous pensez encore qu'il y a un problème, pourriez-vous être plus clair de son de la source?Epsilon n'est pas proportionnelle de manière continue. Avec la norme IEEE encodage, epsilon est proportionnelle à une valeur discrète sur la base 2. stackoverflow.com/questions/5064377/...
OriginalL'auteur AProgrammer
La différence entre
X
et la prochaine valeur deX
varie selonX
.DBL_EPSILON
est seulement la différence entre1
et la prochaine valeur de1
.Vous pouvez utiliser
std::nextafter
pour le test de deuxdouble
avec epsilon différence:Si vous souhaitez tester deux
double
avec facteur * epsilon différence, vous pouvez utiliser:OriginalL'auteur Daniel Laügt