Фактическая длинная двойная точность не согласуется с std::numeric_limits

StackOverflow https://stackoverflow.com/questions/2565512

Вопрос

Работая на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top