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