Precisão dupla longa real não concorda com o std :: numeric_limits
-
23-09-2019 - |
Pergunta
Trabalhando no Mac OS X 10.6.2, Intel, com I686-Apple-Darwin10-G ++-4.2.1, e compilando com a bandeira -Arch x86_64, acabei de notar isso enquanto ...
std::numeric_limits<long double>::max_exponent10 = 4932
... Como é esperado, quando um duplo longo é realmente definido como um valor com expoente maior que 308, torna-se inf-na realidade, possui apenas 64 bits de precisão em vez de 80 bits.
Também, sizeof()
está mostrando longos duplos para ter 16 bytes, o que deveriam ser.
Finalmente, usando <limits.h>
fornece os mesmos resultados que <limits>
.
Alguém sabe onde a discrepância pode estar?
long double x = 1e308, y = 1e309;
cout << std::numeric_limits<long double>::max_exponent10 << endl;
cout << x << '\t' << y << endl;
cout << sizeof(x) << endl;
dá
4932
1e+308 Inf
16
Solução
É porque 1e309
é um literal que dá um dobro. Você precisa usar um literal há muito tempo 1e309L
.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow