Моделирование бесконечности для наибольшего двойного значения - PullRequest
16 голосов
/ 27 декабря 2011

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

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

Ответы [ 9 ]

24 голосов
/ 27 декабря 2011

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

Пошёл на стандартное погружение и нашел текст:

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

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


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

7.12.3.3 Макрос isinf

int isinf (вещественное число x);

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

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

20 голосов
/ 27 декабря 2011

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

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

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

9 голосов
/ 27 декабря 2011

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

#include <cfloat>

DBL_MAX
1 голос
/ 27 декабря 2011

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

    #define DBL_MAX         1.7976931348623158e+308 /* max value */
1 голос
/ 27 декабря 2011

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

0x 7ff0 0000 0000 0000   = Infinity
0x fff0 0000 0000 0000   = −Infinity
1 голос
/ 27 декабря 2011

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

1 голос
/ 27 декабря 2011

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

Эта статья может представлять интерес:

http://www.cygnus -software.com / документы / comparingfloats / comparingfloats.htm

Или это:

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

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

FLT_MAX  1E+37
DBL_MAX  1E+37
LDBL_MAX 1E+37  
0 голосов
/ 27 декабря 2011
#include <cmath>
...
double d = INFINITY;

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

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

0 голосов
/ 27 декабря 2011

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

const double infinity =  1.0/0.0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...