2016-05-25 5 views
0

J'écris un programme en C++ où je veux trouver l'epsilon de mon pc. Je veux que le résultat soit double précision (ce qui est 2.2204460492503131 E-16) mais à la place la sortie est 1.0842 E-019 qui est l'epsilon dans la double précision longue.retourne long double au lieu de double

Mon programme est le suivant:

#include <iostream> 

double e = 1.0; 
double x; 

int main() 
{ 

    for (int i = 0; e + 1.0!=1.0 ; i++) 
    { 
     std::cout<<e<<'\n'; 
     x = e; 
     e/=2.0; 
    } 

    std::cout << "The epsilon of this Computer is "<< x <<'\n'; 

    return 0; 
} 

Répondre

0

sortie std::numeric_limits<double>::epsilon() à la place. std::numeric_limits est déclaré dans l'en-tête standard <limits>.

Une technique plus habituelle, si vous devez vraiment calculer (plutôt que de faire confiance à votre bibliothèque standard pour fournir une valeur correcte) est

double epsilon = 1.0; 

while ((1.0 + 0.5 * epsilon) != 1.0) 
    epsilon *= 0.5; 

ou de faire le calcul.

Notez que (bien que vous ne l'avez pas montré comment vous l'avez fait) il peut effectivement être votre calcul long double qui est incorrect, car les valeurs à virgule flottante littéral (comme 1.0) par défaut d'être de type double, non long double - qui pourrait suggérer que l'erreur est dans votre calcul du résultat long double, pas le double un .. Si vous voulez que le résultat soit de type long double, il serait conseillé de donner toutes ces valeurs littérales (1.0, 0.5) le suffixe L, à les forcer à être de type long double. N'oubliez pas d'utiliser une mise en forme appropriée lors de la diffusion de la valeur résultante à std::cout, afin de garantir que la sortie a également la précision/précision dont vous avez besoin. Les paramètres par défaut (ce que vous obtenez si vous ne contrôlez pas le formatage) peuvent différer.