Comment (portablement) obtenir DBL_EPSILON en C / C ++
Je suis en utilisant GCC 3.4 sur Linux (3) et à essayer de comprendre à obtenir DBL_EPSILON
ou au moins une bonne approximation. Comment puis-je l'obtenir par programmation?
source d'informationauteur vehomzzz
Vous devez vous connecter pour publier un commentaire.
Il devrait être dans "float.h". Qui est portable, il fait partie de la C et C++ normes (quoique déconseillé en C++, l'utilisation
<cfloat>
ou sbi réponse à la "garantie" que la compatibilité ascendante).Si vous ne l'avez pas, alors depuis votre double IEEE 64 bits, vous pouvez tout simplement voler la valeur de quelqu'un d'autre flotteur.h. Voici le premier que j'ai trouvé:
http://opensource.apple.com/source/gcc/gcc-937.2/float.h
#define DBL_EPSILON 2.2204460492503131e-16
La valeur semble correcte pour moi, mais si vous voulez être sûr que votre compilateur, vous pouvez vérifier que
(1.0 + DBL_EPSILON) != 1.0 && (1.0 + DBL_EPSILON/2) == 1.0
Edit: je ne suis pas tout à fait sûr de ce que vous entendez par "par programme". C'est une norme constante, vous n'êtes pas censé le calculer, c'est une propriété de la mise en œuvre donnés dans un fichier d'en-tête. Mais je suppose que vous pourriez faire quelque chose comme cela. Encore une fois, en supposant IEEE représentation ou quelque chose comme ça, alors que DBL_EPSILON est lié à être quelle que soit la puissance de 0,5 représente un 1 dans le dernier bit de la précision de la représentation de la 1.0:
Attention, selon les paramètres du compilateur, les résultats intermédiaires pourraient avoir une précision plus élevée que
double
dans ce cas, vous obtiendrez un plus petit résultat pourd
queDBL_EPSILON
. Vérifiez votre compilateur manuel, ou trouver un moyen de forcer la valeur de1.0 + d/2
être stockées et rechargé pour une réelledouble
objet avant de le comparer à1.0
. Très grossièrement, sur Pc cela dépend si votre compilateur utilise le processeur x86 FPU instructions (plus de précision), ou plus récent x64 virgule flottante ops (double précision).En C++ c'est
std::numeric_limits<double>::epsilon()
.