минимальное значение типа double в C/с++



существует ли стандартный и / или переносимый способ представления наименьшего отрицательного значения (например, для использования отрицательной бесконечности) в программе C (++)?



DBL_MIN в float.h-самый маленький положительное количество.

766   8  

8 ответов:

-DBL_MAXв ANSI C, который определяется в float.з.

числа с плавающей запятой (IEEE 754) симметричны, поэтому, если вы можете представить наибольшее значение (DBL_MAX или numeric_limits<double>::max()), просто добавьте знак минус.

и тогда это классный способ:

double f;
(*((long long*)&f))= ~(1LL<<52);

В C, используйте

#include <float.h>

const double lowest_double = -DBL_MAX;

В C++pre-11, используйте

#include <limits>

const double lowest_double = -std::numeric_limits<double>::max();

В C++11 и далее использовать

#include <limits>

constexpr double lowest_double = std::numeric_limits<double>::lowest();

попробуйте это:

-1 * numeric_limits<double>::max()

ссылки: numeric_limits

этот класс специализирован для каждого из основные типы, со своими члены, возвращающиеся или устанавливаемые на различные значения, которые определяют свойства этого типа в специфическая платформа в которой оно составляет.

вы ищете фактическую бесконечность или минимальное конечное значение? Если первый, используйте

-numeric_limits<double>::infinity()

который работает только если

numeric_limits<double>::has_infinity

в противном случае, вы должны использовать

numeric_limits<double>::lowest()

, который был введен в C++11.

если lowest() недоступно, вы можете вернуться к

-numeric_limits<double>::max()

который может отличаться от lowest() в принципе, но обычно не на практике.

действительно портативное решение C++

как из C++11 вы можете использовать numeric_limits<double>::lowest(). Согласно стандарту, он возвращает именно то, что вы ищете:

конечное значение x такое, что нет другого конечного значения y, где y < x.
значимый для всех специализаций, в которых is_bounded != false.

онлайн демо


много не портативный C++ ответы здесь !

есть много ответов для -std::numeric_limits<double>::max().

к счастью, они будут хорошо работать в большинстве случаев. Схемы кодирования с плавающей запятой разлагают число в мантиссе и экспоненте и большинство из них (например, популярный IEEE-754) используйте отдельный знаковый бит, который не принадлежит мантиссе. Это позволяет превратить самый большой позитив в самый маленький минус просто перевернув знак:

enter image description here

почему они не переносные ?

стандарт не накладывает никаких стандартов с плавающей запятой.

Я согласен, что мой аргумент немного теоретический, но предположим, что какой-то эксцентричный компилятор будет использовать революционную схему кодирования с мантиссой, закодированной в некоторых вариациях a два. Два кодирования дополнения не являются симметричными. например, для знакового 8-битного символа максимальный позитив-127, но минимальный минус -128. Таким образом, мы могли бы представить, что некоторые кодировки с плавающей точкой показывают подобное асимметричное поведение.

Я не знаю никакой схемы кодирования, как это, но дело в том, что стандарт не гарантирует, что переворачивание знака даст желаемый результат. Так что это популярный ответ (Извините, ребята !) не может рассматриваться как полностью портативное стандартное решение ! /* по крайней мере, если вы не утверждали, что numeric_limits<double>::is_iec559 - это правда */

- std::numeric_limits<double>::max()

должно работать нормально

числовые пределы

исходный вопрос-бесконечность. Так почему бы не использовать

#define Infinity  ((double)(42 / 0.0))

в соответствии с определением стандарта IEEE? Вы можете отрицать это, конечно.

Comments

    Ничего не найдено.