Nim:如何检查浮点数是 nan 还是 inf?

blu*_*e10 5 nim-lang

如何检查浮点变量是否为NaNor inf。在标准库中搜索isNaNisInf不会透露任何内容。有一篇博文建议使用

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

但标准库里真的什么都没有吗?

blu*_*e10 6

标准库确实提供了对 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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

classify还可以测试其他属性,例如fcSubnormalfcNegZero、 或fcNegInf(请参阅FloatClass)。