#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, ЛИБО макросы не работают.