2016-10-05 5 views
1

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

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

Я использую 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:%lu\n", 
    val10, LDBL_MIN, LDBL_MAX, longd_size); 

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

+1

Опубликовать код/​​вывод, а не просто _describe_ код/​​вывод. Почему, по вашему мнению, значения 'LDBL_MAX/DBL_MAX' должны отличаться или быть проблемой? – chux

+0

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

+0

Код: printf ("Тип: Длинное двойное значение:% lf Мин:% e Макс:% e Память:% lu \ n", val10, LDBL_MIN, LDBL_MAX, longd_size); Это проблема, потому что мое назначение требует двух разных значений для LDBL и DBL. – Tsurupeta

ответ

1

От this reference on the lfoating point types:

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

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

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

3

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

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

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

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

0

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

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

+0

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

+0

Вот что я сказал. Либо длинный двойник - это просто псевдоним для двойного ИЛИ макросы сломаны. –