Подтвердить что ты не робот

Минимальное двойное значение в C/С++

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Попробуйте следующее:

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

Ссылка: numeric_limits

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

Ответ 4

В 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();

Ответ 5

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

-numeric_limits<double>::infinity()

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

numeric_limits<double>::has_infinity

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

numeric_limits<double>::lowest()

который вводится в С++ 11.

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

-numeric_limits<double>::max()

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

Ответ 7

По-настоящему портативное решение на С++

Как из С++ 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 истинно */

Ответ 8

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

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

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