Печатать длинные двойные на окнах
Я использую Microsoft Visual Studio 2010 и Intel C++ Compiler XE 14.0. Конфигурация проекта - "x64". Мне нужно работать с long double
тип данных. Я добавил опцию компиляции /Qlong_double
и написал тестовый пример:
long double ld = 2;
long double res = std::sqrt(ld);
printf("long double size: %i, value: %Lf", sizeof(res), res);
printf("double value of res: %f", (double)res);
Выход:
длинный двойной размер: 16, значение: 0,000000
двойное значение res: 1,414214
Я обнаружил, что проблема в том, что стандартные библиотеки C для Windows не поддерживают long double. Пытался использовать MPFR:
long double ld = 2;
long double res = std::sqrt(ld);
mpfr_t test;
mpfr_init2(test, 100);
mpfr_set_ld(test, res, GMP_RNDN);
mpfr_printf("\nmpfr long double: %Rf\n", test);
Выход:
mpfr long double: 0
Нет ли метода (в том числе низкоуровневого) для правильной печати длинных двойных значений в Microsoft Windows? Может быть, я могу получить и распечатать отдельные значения и экспоненты?
UPD:
Я написал пример, чтобы увидеть, выполняются ли вычисления с long double:
int count = 0;
long double e = static_cast<long double>(1.0);
while (static_cast<long double>(1.0) + e / static_cast<long double>(2.0) > static_cast<long double>(1.0)){
e /= static_cast<long double>(2.0);
count++;
}
cout<< endl<< "COUNT LONG DOUBLE: " << count<<endl;
double de = 1.0;
count = 0;
while (1.0 + de / 2.0 > 1.0){
de /= 2.0;
count++;
}
cout<< endl<< "COUNT DOUBLE: " << count<<endl;
Выход:
COUNT LONG DOUBLE: 52
COUNT DOUBLE: 52
Это означает, что работа выполняется с двойным вместо длинного двойного (хотя /Qlong_double
флаг установлен). Какие есть идеи?