Nim: Как проверить, является ли число с плавающей точкой nan или inf?

Как я могу проверить, является ли переменная с плавающей точкой NaN или же inf, Поиск в стандартной библиотеке для isNaN или же isInf ничего не раскрывает. Есть сообщение в блоге, предлагающее использовать

proc cIsNaN(x: float): int {.importc: "isnan", header: "<math.h>".}

но разве в стандартной библиотеке ничего нет?

2 ответа

Решение

Стандартная библиотека обеспечивает проверку NaN/inf, но в соответствии с обобщенной концепцией classify Вот почему это легко пропустить. Проиллюстрировать:

import math

# Inf and NaN literals are defined in system.nim as
# Inf* {.magic: "Inf".} = 1.0 / 0.0
# NaN* {.magic: "NaN".} = 0.0 / 0.0

let floatsToTest = [0.0, Inf, NaN]
for x in floatsToTest:
  echo x, " is NaN ", x.classify == fcNaN
  echo x, " is inf ", x.classify == fcInf

Выход:

0.0 is NaN false
0.0 is inf false
inf is NaN false
inf is inf true
nan is NaN true
nan is inf false

classify можно также проверить на другие свойства, такие как fcSubnormal, fcNegZero, или же fcNegInf (увидеть FloatClass).

Вы можете добавить свою функцию

      import std/math

func is_number*(n: float): bool =
  let ntype = n.classify
  ntype == fc_normal or ntype == fc_zero or ntype == fc_neg_zero
Другие вопросы по тегам