cpp

Бесконечность и значение NAN

Целочисленное деление на 0 приведет к ошибке, а вот с вещественными числами все обстоит несколько иначе. Деление вещественного числа на 0 приведет к значению плюс или минус Inf (бесконечность), а деление вещественного числа 0.0 на 0.0 — к значению NaN (нет числа):

var x, y, z float64 = 10.5, 0.0, 0.0
fmt.Println(x / y)                      // +Inf
fmt.Println(z / y)                      // NaN

В пакете math определены следующие функции:

  • Inf() — возвращает значение плюс или минус бесконечность в зависимости от знака параметра sign. Формат функции:
math.Inf(sign int) float64

Пример:

fmt.Println(math.Inf(1))                  // +Inf
fmt.Println(math.Inf(-1))                 // -Inf
fmt.Println(math.Inf(0))                  // +Inf
  • IsInf() — если sign равно 0, то возвращает значение true, если f содержит значение плюс или минус бесконечность. Если sign больше 0, то возвращает значение true, если f содержит значение плюс бесконечность. Если sign меньше 0, то возвращает значение true, если f содержит значение минус бесконечность. Формат функции:
math.IsInf(f float64, sign int) bool

Пример:

fmt.Println(math.IsInf(math.Inf(1), 0))   // true
fmt.Println(math.IsInf(math.Inf(-1), 0))  // true
fmt.Println(math.IsInf(15.5, 0))          // false
fmt.Println(math.IsInf(math.Inf(1), 1))   // true
fmt.Println(math.IsInf(math.Inf(-1), 1))  // false
fmt.Println(math.IsInf(math.Inf(1), -1))  // false
fmt.Println(math.IsInf(math.Inf(-1), -1)) // true
  • NaN() — возвращает значение NaN (нет числа). Формат функции:
math.NaN() float64

Пример:

fmt.Println(math.NaN())                   // NaN
fmt.Println(math.NaN() + 1)               // NaN
fmt.Println(0 * math.Inf(1))              // NaN
fmt.Println(math.Inf(1) / math.Inf(1))    // NaN
fmt.Println(math.Inf(-1) + math.Inf(1))   // NaN
  • IsNaN() — возвращает значение true, если f равно NaN, и false — в противном случае. Формат функции:
math.IsNaN(f float64) (is bool)

Пример:

fmt.Println(math.IsNaN(math.Inf(1)))      // false
fmt.Println(math.IsNaN(math.Inf(-1)))     // false
fmt.Println(math.IsNaN(15.5))             // false
fmt.Println(math.IsNaN(math.NaN()))       // true

Для проверки соответствия значению NaN нельзя использовать логические операторы, т. к. значение NaN не равно даже самому себе:

fmt.Println(math.NaN() == math.NaN())     // false

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

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

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

cpp