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