Печатать длинные двойные на окнах

Я использую 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 флаг установлен). Какие есть идеи?

0 ответов

Другие вопросы по тегам