2010-04-02 4 views
1

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

Répondre

5

C'est parce que 1e309 est un littéral qui donne un double. Vous devez utiliser un double littéral long 1e309L.

+0

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

+0

Oui, malheureusement, pow ((long double) 2, 1020) = 1.12356e + 307 et pow ((long double) 2, 1030) = inf ... des idées? – dmb

+2

@dmb: Il existe 3 variantes de 'pow'. 'pow' fonctionne sur' double'. Vous avez besoin de "powl". – kennytm

Questions connexes