минимальное двойное значение в C / C ++ - PullRequest
76 голосов
/ 20 июля 2009

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

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

Ответы [ 8 ]

116 голосов
/ 20 июля 2009

-DBL_MAX в ANSI C , что определено в float.h.

69 голосов
/ 20 июля 2009

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

А потом классный способ:

double f;
(*((long long*)&f))= ~(1LL<<52);
37 голосов
/ 15 июля 2013

В 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();
32 голосов
/ 20 июля 2009

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

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

Ссылка: numeric_limits

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

20 голосов
/ 20 июля 2009

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

-numeric_limits<double>::infinity()

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

numeric_limits<double>::has_infinity

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

numeric_limits<double>::lowest()

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

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

-numeric_limits<double>::max()

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

9 голосов
/ 22 сентября 2016

По-настоящему портативное решение 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

Почему они не портативны?

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

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

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

7 голосов
/ 20 июля 2009
- std::numeric_limits<double>::max()

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

Числовые ограничения

1 голос
/ 22 сентября 2016

Оригинальный вопрос касается бесконечности. Так почему бы не использовать

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...