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

#c #double #long-double

#c #двойное #long-двойное

Вопрос:

Я работаю с C, мне нужно выполнить упражнение, в котором я должен напечатать значение long double min и 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);
  

Это проблема, потому что для моего назначения требуются два разных значения для LDBL и DBL .

Комментарии:

1. Публикуйте код / вывод, а не просто описывайте код / вывод. Как вы думаете, почему значения LDBL_MAX/DBL_MAX должны отличаться или это проблема?

2. MSVC имеет #define LDBL_MAX DBL_MAX и аналогичное значение для MIN. Он реализует long double , но он такой же, как double .

3. Код: printf(«Тип: длинное двойное значение: %lf Min: %e Max: %e Memory:%lu n», val10, LDBL_MIN, LDBL_MAX, longd_size); Это проблема, потому что мое назначение требует двух разных значений для LDBL и DBL

4. Этот вопрос был вызван проблемой, которую больше нельзя воспроизвести , или простой опечаткой. Хотя подобные вопросы могут быть здесь по теме, этот был решен таким образом, который вряд ли поможет будущим читателям. Этого часто можно избежать, определив и внимательно изучив самую короткую программу, необходимую для воспроизведения проблемы перед публикацией.

5. @Tsurupeta: Почему вы пытаетесь printf использовать предположительно long double значение %e ? %e для float double ). Для long double вас нужно %Le .

Ответ №1:

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

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

Что касается Visual Studio, MS Long Double помогает.

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

Ответ №2:

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

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

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

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

Ответ №3:

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

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

Комментарии:

1. Точно так long int же, как не обязательно должно быть «лучше», чем int , то же самое верно long double и для . Это не делает реализацию «сломанной».

2. Это то, что я сказал. Либо long double — это просто псевдоним double, ЛИБО макросы не работают.