Вопрос о моделировании бесконечности в С++ для типа данных double
. Мне это нужно в заголовочном файле, поэтому мы не можем использовать такие функции, как numeric_limits
.
Существует ли определенная константа, представляющая наибольшее значение?
Вопрос о моделировании бесконечности в С++ для типа данных double
. Мне это нужно в заголовочном файле, поэтому мы не можем использовать такие функции, как numeric_limits
.
Существует ли определенная константа, представляющая наибольшее значение?
Числа с плавающей запятой (например, двойные) могут фактически содержать положительную и отрицательную бесконечность. Константа 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 возвращает ненулевое значение тогда и только тогда, когда его аргумент имеет бесконечное значение.
numeric_limits
все функции constexpr, поэтому они прекрасно работают как константы времени компиляции (при условии, что вы используете текущую версию C++). Так что std::numeric_limits<double>::infinity()
должен работать в любом контексте.
Даже если вы используете более старую версию, это все равно будет работать везде, где вам не требуется константа времени компиляции. Из вашего вопроса неясно, действительно ли вам нужна постоянная времени компиляции или нет; просто нахождение в заголовке не обязательно требует этого.
Если вы используете более старую версию и вам действительно нужна постоянная времени компиляции, вам подойдет макрос INFINITY
в cmath. На самом деле это значение бесконечности float
, но его можно преобразовать в double
.
Не уверен, почему вы не можете использовать std::numeric_limits в заголовочном файле. Но это также перенесено из ANSI C:
#include <cfloat>
DBL_MAX
Возможно, в среде C++ у вас есть float.h
, см. http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)
Я думал, что ответ был "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
Из Википедии:
0x 7ff0 0000 0000 0000 = Infinity
0x fff0 0000 0000 0000 = −Infinity
Можно использовать DBL_MAX. Это находится в float.h следующим образом
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#include <cmath>
...
double d = INFINITY;
Вы можете найти INFINITY
, определенное в <cmath>
(math.h
):
Постоянное выражение типа
float
, представляющее положительную или беззнаковую бесконечность, если доступно; иначе положительная константа типаfloat
, которая переполняется во время перевода.
Разве это не сработает?
const double infinity = 1.0/0.0;