2009-12-21 6 views
2

Je n'ai aucun problème à convertir des valeurs doubles "normales", mais je ne peux pas convertir numeric_limits<double>::max() ou DBL_MAX représentations de chaînes?Comment convertir une chaîne (contenant double max) en double

std::string max = "1.79769313486232e+308"; 

std::istringstream stream(max); 
double value; 

// enters here, failbit is set 
if (!(stream >> value)) 
+0

Notez que vous avez besoin de 17 chiffres décimaux pour déterminer de manière unique un double, pas 15. – avakar

Répondre

10

pourrait-il être quelque chose comme la valeur réelle de DBL_MAX n'est pas exactement représentable en notation exponentielle avec 16 décimales (dire la valeur décimale est très légèrement plus grande que les deux represenation base), mais l'initialisation d'une double avec le DBL_MAX va néanmoins régler la valeur correcte (en raison de l'arrondissement). std::istringstream peut être un peu plus sélectif.

EDIT: En fait, je trouve que la valeur de DBL_MAX dans mon compilateur est 1.7976931348623158e + 308 qui fonctionne très bien pour moi de ruisseau. Votre nombre est arrondi et légèrement plus grand, d'où l'échec.

EDIT2: La valeur exacte de DBL_MAX sous forme décimale est donnée par (2^(1023 - 52)) * (2^53 - 1) qui est représentable pas avec 16 décimales.

+0

Oui ... J'ai vérifié, et j'étais sur le point de répondre à la même chose! Vous devez être très prudent avec ces choses ... – PierreBdR

+0

Vous avez raison, pour une raison quelconque, ma valeur était erronée. DBL_MAX est 1.7976931348623158e + 308 –

+0

"la valeur réelle de DBL_MAX n'est pas exactement représentable". La valeur réelle de DBL_MAX est un nombre entier, elle est exactement représentable dans n'importe quelle base. Pas nécessairement représentable en notation exponentielle avec 16 décimales. Donc nous savons ce que vous voulez dire, mais ce n'est pas tout à fait ce que vous avez dit ;-) –

1

si vous utilisez

double v = 1.79769313486232e+308; 
cout << v << endl; 

il vous donnera inF. cela signifie que le nombre littéral est actuellement supérieur au double maintenant.

Questions connexes