Определение LDBL_MAX / MIN на C

Я работаю с C, я должен сделать упражнение, в котором я должен напечатать значение long double minand long double max.

Я использовал float.hв качестве заголовка, но эти два макроса (LDBL_MIN/MAX) дают мне такое же значение, как если бы это был просто double.

Я использую Visual Studio 2015, и если я наведу на него указатель мыши, на LDBL MINнем будет написано #define LDBL_MIN DBL_MIN. Это поэтому он печатает dbl_minвместо ldbl_min?

Как устранить эту проблему?

printf("Type: Long Double Value: %lf Min: %e Max: %e Memory:%lun", 
    val10, LDBL_MIN, LDBL_MAX, longd_size);

Это проблема, потому что мое назначение требует двух различных значений для LDBLand DBL.

3 ответа

  1. Из этой ссылки на типы точек lfoating:

    long double — выдвинутый тип с плавающей запятой точности. Соответствует расширенному типу с плавающей запятой IEEE-754, если поддерживается, в противном случае соответствует некоторому нестандартному расширенному типу с плавающей запятой до тех пор , пока его точность лучше, чем doubleи диапазон по крайней мере так же хорош, как doubleв противном случае соответствует типу double. В некоторых реализациях x86 и x86_64 используется 80-разрядный тип с плавающей точкой x87.

    Добавленный акцент-мой.

    Приведенная выше цитата говорит о том, что, хотя совместимый компилятор C должен иметь long doubleтип, на самом деле он не должен поддерживать его иначе, чем double. Что-то, что, вероятно, относится к компилятору Visual Studio C.

  2. C не указывает, что long doubleдолжен иметь большую точность/диапазон, чем double.

    Таким образом, даже если реализация рассматривает их как разные типы, они могут иметь ту же реализацию, диапазон, точность, минимальное значение, максимальное значение и т. д.

    В Visual Studio помогает MS Long Double.

    Чтобы устранить проблему, используйте другой компилятор, который поддерживает long doubleс большей точностью / диапазоном, чем double. Возможно GCC ?

  3. Эти макросы либо сломаны, либо long double-это просто псевдоним для double в вашей системе. Чтобы проверить, установите long double на DBL_MAX, умножьте на два, затем вычитайте DBL_MAX из него. Если результат конечен, то у вас есть дополнительное пространство экспоненты в длинном двойнике. Если нет, и long double больше, чем double, дополнительные байты могут быть просто заполнением, или у вас может быть то же пространство экспоненты и больше точности. Таким образом, подлинное значение LDBL_MAX будет всего лишь капелькой по сравнению с DBL_MAX.

    Самый простой способ генерировать max-это просто искать двоичное представление. Однако, если вы хотите сделать это в портативном C, вы можете зондировать его с помощью повторных умножений, чтобы получить величину, а затем заполнить мантиссу путем многократного добавления нисходящих степеней двух, пока не закончится точность.