Бесконечность и значение 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

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов