Pregunta

Trabajo en Mac OS X 10.6.2, Intel, con i686-manzana-darwin10-g ++ - 4.2.1, y compilar con la bandera x86_64 -arch, sólo se dio cuenta de que mientras ...

std::numeric_limits<long double>::max_exponent10 = 4932

... como es de esperar, cuando una larga doble es en realidad establece en un valor con una mayor exponente de 308, se convierte en inf. - es decir, en realidad sólo tiene una precisión de 64 bits en lugar de 80bit

Además, sizeof() está mostrando dobles largos a ser de 16 bytes, lo que deberían ser.

Finalmente, utilizando <limits.h> da los mismos resultados que <limits>.

¿Alguien sabe donde la discrepancia podría ser?

long double x = 1e308, y = 1e309;  
cout << std::numeric_limits<long double>::max_exponent10 << endl;  
cout << x << '\t' << y << endl;  
cout << sizeof(x) << endl;

da

  

4932
  1e + 308 inf
  16

¿Fue útil?

Solución

Es porque 1e309 es un literal que da un doble. Es necesario utilizar un 1e309L largo doble literal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top