2010-04-02 4 views
1

Работает на Mac OS X 10.6.2, Intel, с i686-apple-darwin10-g ++ - 4.2.1 и компиляции с флагом -arch x86_64, я просто заметил, что, хотя ...Фактическая длинная двойная точность не согласуется с std :: numeric_limits

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

... как ожидается, когда длинный двойной фактически установлено значение, с показателем более чем 308, оно становится инф - то есть на самом деле это только точность 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; 

дает

1e + 308 инф

ответ

5

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

+0

Удивительный, спасибо. К сожалению, я использовал только литералы в качестве тестового примера, после того как я заметил, что это происходит с возвращаемыми значениями функции pow() даже при очень тщательном наборе текста. Слава богу, это не проблема компилятора! – dmb

+0

Да, к сожалению, pow ((длинный двойной) 2, 1020) = 1.12356e + 307 и pow ((long double) 2, 1030) = inf ... любые идеи? – dmb

+2

@dmb: Существует 3 варианта 'pow'. 'pow' работает на' double'. Вам нужно 'powl'. – kennytm