Фактическая длинная двойная точность не согласуется с std::numeric_limits
-
23-09-2019 - |
Вопрос
Работая на Mac OS X 10.6.2, Intel, с i686-apple-darwin10-g++-4.2.1 и компилируя с флагом -arch x86_64, я только что заметил, что...
std::numeric_limits<long double>::max_exponent10 = 4932
... как и ожидалось, когда для long double фактически установлено значение с экспонентой больше 308, оно становится inf - т.е. на самом деле оно имеет только 64-битную точность вместо 80-битной.
Также, sizeof()
показывает, что длинные двойные значения имеют длину 16 байт, как и должно быть.
Наконец, используя <limits.h>
дает те же результаты, что и <limits>
.
Кто-нибудь знает, где может быть несоответствие?
long double x = 1e308, y = 1e309;
cout << std::numeric_limits<long double>::max_exponent10 << endl;
cout << x << '\t' << y << endl;
cout << sizeof(x) << endl;
дает
4932
1e+308 инф.
16
Решение
Это потому что 1e309
это литерал, который дает двойное значение.Вам нужно использовать длинный двойной литерал 1e309L
.
Не связан с StackOverflow