Travaillant sur Mac OS X 10.6.2, Intel, avec i686-apple-darwin10-g ++ - 4.2.1, et compilant avec le drapeau -arch x86_64, je viens remarqué que si ...La double précision réelle n'est pas en accord avec std :: numeric_limits
std::numeric_limits<long double>::max_exponent10 = 4932
... comme il est prévu, lorsqu'un long double est effectivement mis à une valeur avec un exposant supérieur à 308, il devient inf - dire en réalité, il a seulement la précision 64bit au lieu de 80bit.
En outre, sizeof()
affiche des doubles longs de 16 octets, ce qu'ils devraient être.
Enfin, en utilisant <limits.h>
donne les mêmes résultats que <limits>
.
Est-ce que quelqu'un sait où l'écart pourrait être?
long double x = 1e308, y = 1e309;
cout << std::numeric_limits<long double>::max_exponent10 << endl;
cout << x << '\t' << y << endl;
cout << sizeof(x) << endl;
donne
1e + 308 inf
Génial, merci. Malheureusement, je n'utilisais que les littéraux comme cas de test, après avoir remarqué que cela se produisait avec les valeurs de retour de la fonction pow(), même avec un typage très prudent. Dieu merci, ce n'est pas un problème de compilateur! – dmb
Oui, malheureusement, pow ((long double) 2, 1020) = 1.12356e + 307 et pow ((long double) 2, 1030) = inf ... des idées? – dmb
@dmb: Il existe 3 variantes de 'pow'. 'pow' fonctionne sur' double'. Vous avez besoin de "powl". – kennytm