Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Бесконечность и значение NAN
Целочисленное деление на 0
приведет к неопределенности, а вот с вещественными числами все обстоит несколько иначе. Деление вещественного числа на 0
приведет к значению плюс или минус INFINITY
(бесконечность), а деление вещественного числа 0.0
на 0.0
— к значению NAN
(нет числа):
std::cout << 10.0 / 0.0 << std::endl; // inf
std::cout << -10.0 / 0.0 << std::endl; // -inf
std::cout << 0.0 / 0.0 << std::endl; // nan
В заголовочном файле math.h
для этих значений существуют константы INFINITY
и NAN
:
// #include <cmath> или #include <math.h>
std::cout << INFINITY << std::endl; // inf
std::cout << -INFINITY << std::endl; // -inf
std::cout << NAN << std::endl; // nan
std::cout << NAN + 1 << std::endl; // nan
std::cout << 0 * INFINITY << std::endl; // nan
std::cout << INFINITY / INFINITY << std::endl; // nan
std::cout << -INFINITY + INFINITY << std::endl; // nan
Для проверки соответствия этим значениям нельзя использовать логические операторы. Например, значение NAN
не равно даже самому себе:
std::cout << (NAN == NAN) << std::endl; // 0
Чтобы проверить значения, нужно воспользоваться следующими функциями:
_finite()
и_finitef()
— возвращают ненулевое число, если значение не равно плюс или минус бесконечность или значениюNAN
, и0
— в противном случае. Прототипы функций:
#include <cmath> /* или #include <math.h> */
int _finitef(float x); // Только в версии x64 (MinGW-W64)
int _finite(double x);
Пример:
std::cout << _finite(10.5) << std::endl; // 1
std::cout << _finite(0.0) << std::endl; // 1
std::cout << _finite(NAN) << std::endl; // 0
std::cout << _finite(INFINITY) << std::endl; // 0
isnormal()
— возвращаетtrue
, если значение не равно плюс или минус бесконечность, значениюNAN
или0.0
, иfalse
— в противном случае. Прототипы функции:
#include <cmath>
bool isnormal(float x);
bool isnormal(double x);
bool isnormal(long double x);
Пример:
std::cout << std::isnormal(10.5) << std::endl; // 1
std::cout << std::isnormal(0.0) << std::endl; // 0
std::cout << std::isnormal(NAN) << std::endl; // 0
std::cout << std::isnormal(INFINITY) << std::endl; // 0
_isnan()
,_isnanf()
иisnan()
— возвращают ненулевое число, если значение равноNAN
, и0
— в противном случае. Прототипы функций:
#include <cmath> /* или #include <math.h> */
int _isnanf(float x); // Только в версии x64 (MinGW-W64)
int _isnan(double x);
bool isnan(float x);
bool isnan(double x);
bool isnan(long double x);
Пример:
std::cout << std::isnan(10.5) << std::endl; // 0
std::cout << std::isnan(INFINITY) << std::endl; // 0
std::cout << std::isnan(NAN) << std::endl; // 1
std::cout << _isnan(10.5) << std::endl; // 0
std::cout << _isnan(INFINITY) << std::endl; // 0
std::cout << _isnan(NAN) << std::endl; // 1
isinf()
— возвращаетtrue
, если значение равно плюс или минус бесконечность, иfalse
— в противном случае. Прототипы функции:
#include <cmath>
bool isinf(float x);
bool isinf(double x);
bool isinf(long double x);
Пример:
std::cout << std::isinf(10.5) << std::endl; // 0
std::cout << std::isinf(NAN) << std::endl; // 0
std::cout << std::isinf(INFINITY) << std::endl; // 1
std::cout << std::isinf(-INFINITY) << std::endl; // 1
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов