Фактическая длинная двойная точность не соответствует std :: numeric_limits - PullRequest
1 голос
/ 02 апреля 2010

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

1 Ответ

5 голосов
/ 02 апреля 2010

Это потому, что 1e309 - это литерал, который дает двойное число. Вам нужно использовать длинный-двойной литерал 1e309L.

...