Существует ли стандартный и/или переносимый способ представления наименьшего отрицательного значения (например, для использования отрицательной бесконечности) в программе C (++)?
DBL_MIN в float.h - наименьшее положительное число.
Существует ли стандартный и/или переносимый способ представления наименьшего отрицательного значения (например, для использования отрицательной бесконечности) в программе C (++)?
DBL_MIN в float.h - наименьшее положительное число.
-DBL_MAX
в ANSI C, который определен в float.h.
Числа с плавающей запятой (IEEE 754) являются симметричными, поэтому, если вы можете представить наибольшее значение (DBL_MAX
или numeric_limits<double>::max()
) просто добавьте знак минуса.
И тогда это классный способ:
double f;
(*((long long*)&f))= ~(1LL<<52);
Попробуйте следующее:
-1 * numeric_limits<double>::max()
Ссылка: numeric_limits
Этот класс специализирован для каждого из фундаментальные типы, с его членов, возвращающихся или различные значения, определяющие свойства, которые имеют тип конкретной платформы, на которой она компилирует.
В C используйте
#include <float.h>
const double lowest_double = -DBL_MAX;
В С++ pre-11 используйте
#include <limits>
const double lowest_double = -std::numeric_limits<double>::max();
В С++ 11 и далее используйте
#include <limits>
constexpr double lowest_double = std::numeric_limits<double>::lowest();
Вы ищете фактическую бесконечность или минимальное конечное значение? Если первое, используйте
-numeric_limits<double>::infinity()
который работает только, если
numeric_limits<double>::has_infinity
В противном случае вы должны использовать
numeric_limits<double>::lowest()
который вводится в С++ 11.
Если lowest()
недоступно, вы можете вернуться к
-numeric_limits<double>::max()
которая в принципе может отличаться от lowest()
, но обычно это не на практике.
- std::numeric_limits<double>::max()
должен отлично работать
Как из С++ 11 вы можете использовать numeric_limits<double>::lowest()
.
В соответствии со стандартом он возвращает именно то, что вы ищете:
Конечное значение x такое, что нет другого конечного значения y, где
y < x
.
Значение для всех специализаций, в которыхis_bounded != false
.
Будет много ответов для -std::numeric_limits<double>::max()
.
К счастью, они будут хорошо работать в большинстве случаев. Схемы кодирования с плавающей запятой разлагают число в мантиссе и экспоненте, и большинство из них (например, популярный IEEE-754) используют отдельный бит знака, которая не принадлежит мантиссе. Это позволяет преобразовать наибольшее положительное значение в наименьшем отрицании, просто щелкнув знак:
Стандарт не налагает никакого стандарта с плавающей запятой.
Я согласен с тем, что мой аргумент немного теоретичен, но предположим, что какой-то эксцентричный разработчик компилятора использовал бы революционную схему кодирования с мантиссой, закодированной в некоторых вариантах два дополнения. Кодирование двух дополнений не является симметричным. например, для подписанного 8 бит char максимальный положительный - 127, но минимальный минус - -128. Таким образом, мы могли бы представить, что кодирование с плавающей запятой показывает аналогичное асимметричное поведение.
Мне не известно о какой-либо схеме кодирования, как это, но дело в том, что стандарт не гарантирует, что переключение знака дает ожидаемый результат. Так что этот популярный ответ (извините, ребята!) Не может считаться полностью портативным стандартным решением! /* по крайней мере, если вы не утверждаете, что numeric_limits<double>::is_iec559
истинно */
Оригинальный вопрос касается бесконечности. Итак, почему бы не использовать
#define Infinity ((double)(42 / 0.0))
в соответствии с определением IEEE? Конечно, это можно отрицать.