Моделирование бесконечности для наибольшего двойного значения

Вопрос о моделировании бесконечности в С++ для типа данных double. Мне это нужно в заголовочном файле, поэтому мы не можем использовать такие функции, как numeric_limits.

Существует ли определенная константа, представляющая наибольшее значение?


person ashim    schedule 27.12.2011    source источник


Ответы (9)


Числа с плавающей запятой (например, двойные) могут фактически содержать положительную и отрицательную бесконечность. Константа INFINITY должна быть в вашем заголовке math.h.

Пошел стандартно нырять и нашел текст:

4 Макрос INFINITY расширяется до константного выражения типа float, представляющего положительную или беззнаковую бесконечность, если доступно; else в положительную константу типа float, которая переполняется во время трансляции.

В разделе 7.12 Mathematics <math.h>


Тогда, конечно, у вас есть вспомогательная функция isinf для проверки бесконечности (которая также есть в math.h).

7.12.3.3 Макрос isinf

int isinf(вещественно-плавающее x);

Описание: Макрос isinf определяет, является ли значение его аргумента бесконечным (положительным или отрицательным). Во-первых, аргумент, представленный в формате, более широком, чем его семантический тип, преобразуется в его семантический тип. Затем определение основывается на типе аргумента.

Возвращает: макрос isinf возвращает ненулевое значение тогда и только тогда, когда его аргумент имеет бесконечное значение.

person Lalaland    schedule 27.12.2011
comment
@JamWaffles Стандарты C на самом деле удивительно читабельны. Это стандарты C++, которые, кажется, написаны чрезмерно усердными юристами языка. - person Lalaland; 27.12.2011
comment
Поскольку технически вопрос заключается в том, что для C++ следует использовать заголовок #include ‹cmath› вместо #include ‹math.h›. - person lefticus; 27.12.2011

numeric_limits все функции constexpr, поэтому они прекрасно работают как константы времени компиляции (при условии, что вы используете текущую версию C++). Так что std::numeric_limits<double>::infinity() должен работать в любом контексте.

Даже если вы используете более старую версию, это все равно будет работать везде, где вам не требуется константа времени компиляции. Из вашего вопроса неясно, действительно ли вам нужна постоянная времени компиляции или нет; просто нахождение в заголовке не обязательно требует этого.

Если вы используете более старую версию и вам действительно нужна постоянная времени компиляции, вам подойдет макрос INFINITY в cmath. На самом деле это значение бесконечности float, но его можно преобразовать в double.

person bames53    schedule 27.12.2011

Не уверен, почему вы не можете использовать std::numeric_limits в заголовочном файле. Но это также перенесено из ANSI C:

#include <cfloat>

DBL_MAX
person Gerald    schedule 27.12.2011

Возможно, в среде C++ у вас есть float.h, см. http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)

person Joop Eggen    schedule 27.12.2011

Я думал, что ответ был "42.0" ;)

Эта статья может быть интересна:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

Или это:

http://www.cplusplus.com/reference/clibrary/cfloat/

MAXimum Максимальное конечное представимое число с плавающей запятой:

FLT_MAX  1E+37
DBL_MAX  1E+37
LDBL_MAX 1E+37  
person paulsm4    schedule 27.12.2011

Из Википедии:

0x 7ff0 0000 0000 0000   = Infinity
0x fff0 0000 0000 0000   = −Infinity
person fge    schedule 27.12.2011
comment
Конечно, OP может быть на платформе, которая не использует числа с плавающей запятой IEEE. - person Omnifarious; 27.12.2011
comment
Я не знаю ни одной текущей платформы. Но моя старая 8-битная система Atari этого не сделала (и да, в ней была плавающая запятая). Но в любом случае это плохая форма. Нельзя сказать, что IEEE с плавающей запятой будет использоваться через десять лет. Это приводит к созданию еще одной «ошибки тысячелетия». - person Omnifarious; 27.12.2011

Можно использовать DBL_MAX. Это находится в float.h следующим образом

    #define DBL_MAX         1.7976931348623158e+308 /* max value */
person Ajit Vaze    schedule 27.12.2011

#include <cmath>
...
double d = INFINITY;

Вы можете найти INFINITY, определенное в <cmath> (math.h):

Постоянное выражение типа float, представляющее положительную или беззнаковую бесконечность, если доступно; иначе положительная константа типа float, которая переполняется во время перевода.

person AusCBloke    schedule 27.12.2011

Разве это не сработает?

const double infinity =  1.0/0.0;
person Pubby    schedule 27.12.2011