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) используйте отдельный знаковый бит, который не принадлежит мантиссе. Это позволяет превратить самый большой позитив в самый маленький минус просто перевернув знак:
почему они не переносные ?
стандарт не накладывает никаких стандартов с плавающей запятой.
Я согласен, что мой аргумент немного теоретический, но предположим, что какой-то эксцентричный компилятор будет использовать революционную схему кодирования с мантиссой, закодированной в некоторых вариациях a два. Два кодирования дополнения не являются симметричными. например, для знакового 8-битного символа максимальный позитив-127, но минимальный минус -128. Таким образом, мы могли бы представить, что некоторые кодировки с плавающей точкой показывают подобное асимметричное поведение.
Я не знаю никакой схемы кодирования, как это, но дело в том, что стандарт не гарантирует, что переворачивание знака даст желаемый результат. Так что это популярный ответ (Извините, ребята !) не может рассматриваться как полностью портативное стандартное решение ! /* по крайней мере, если вы не утверждали, что
numeric_limits<double>::is_iec559- это правда */
исходный вопрос-бесконечность. Так почему бы не использовать
#define Infinity ((double)(42 / 0.0))в соответствии с определением стандарта IEEE? Вы можете отрицать это, конечно.

Comments