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

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

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

73 голоса | спросил Will 20 J000000Monday09 2009, 17:23:51

8 ответов


0

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

ответил dfa 20 J000000Monday09 2009, 17:29:13
0

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

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

double f;
(*((long long*)&f))= ~(1LL<<52);
ответил fortran 20 J000000Monday09 2009, 17:27:02
0

В 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();
ответил rubenvb 15 J000000Monday13 2013, 16:38:47
0

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

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

Ссылка: numeric_limits

  

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

ответил Andrew Hare 20 J000000Monday09 2009, 17:26:05
0

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

-numeric_limits<double>::infinity()

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

numeric_limits<double>::has_infinity

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

numeric_limits<double>::lowest()

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

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

-numeric_limits<double>::max()

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

ответил Christoph 20 J000000Monday09 2009, 17:48:03
0

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

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

  

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

Онлайн-демонстрация


Здесь много непереносимых ответов C ++!

Существует множество ответов для -std::numeric_limits<double>::max().

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

 введите описание изображения здесь

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

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

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

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

ответил Christophe 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 22 Sep 2016 23:37:02 +0300 2016, 23:37:02
0
- std::numeric_limits<double>::max()

должно работать просто отлично

>

ответил MadH 20 J000000Monday09 2009, 17:37:33
0

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

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

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

ответил Norbert 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 22 Sep 2016 22:33:26 +0300 2016, 22:33:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132