Работает на 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 инф
Удивительный, спасибо. К сожалению, я использовал только литералы в качестве тестового примера, после того как я заметил, что это происходит с возвращаемыми значениями функции pow() даже при очень тщательном наборе текста. Слава богу, это не проблема компилятора! – dmb
Да, к сожалению, pow ((длинный двойной) 2, 1020) = 1.12356e + 307 и pow ((long double) 2, 1030) = inf ... любые идеи? – dmb
@dmb: Существует 3 варианта 'pow'. 'pow' работает на' double'. Вам нужно 'powl'. – kennytm