【问题标题】:Is there a way to detect NaN and -NaN?有没有办法检测 NaN 和 -NaN?
【发布时间】:2018-09-12 01:18:32
【问题描述】:

我想将 lua 号保存到字符串并正确处理 NaN 大小写。

检测任何 NaN 都很容易,x ~= x

但是,我发现只有一种方法可以检测到 NaN-NaN 是使用 tostring(x) == 'nan'。有没有更好的方法?

【问题讨论】:

  • 你如何得到 -NaN ?
  • @lhf 0/0-nan-(0/0)nan(如 tostring 所说)。
  • string.pack(">d", your_NaN):byte() > 127
  • @EgorSkriptunoff 没有函数string.pack
  • @val - 这个函数来自 Lua 5.3。要获得相关答案,请使用与您的 Lua 版本相对应的标签标记您的问题。

标签: lua numbers nan


【解决方案1】:

存在两个以上的 NaN(实际上,根据 IEEE-754,存在 2^52-1 NaN)。
他们的tostring-ed 表示依赖于平台。
这是一个如何获取三个不同 NaN 的示例(我使用的是用 Visual Studio 构建的 Lua 5.3):

n = string.unpack(">d", string.pack(">d", 0/0):sub(1, -2).."@")
print(0/0, -(0/0), n) -->  -1.#IND   1.#QNAN   -1.#QNAN

因此,不区分 NaN 的不同变体会更正确。

【讨论】:

    【解决方案2】:

    代替不可移植的tostring(x) == 'nan',您可以根据需要与实际的tostring 调用进行比较:tostring(x) == tostring(0/0)tostring(x) == tostring(-(0/0))。如果需要进行多重比较,可以将tostring的结果保存起来重复使用。

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 2016-03-19
      • 2013-07-23
      • 2021-04-03
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2018-04-27
      相关资源
      最近更新 更多