NaN为什么存在?

Har*_*nin 8 floating-point nan ieee-754

我不是问"为什么这个计算结果是NaN",我问"为什么NaN存在,而不是导致异常或错误?"

我一直想知道这一点,并与人们一起讨论.

我得到的唯一答案就是"你不想尝试 - 抓住每一个分歧,你呢?" "有些情况下NaN是有效的结果".

话虽如此,我从来没有收到过NaN作为有效结果的具体例子.假设NaN不可能是一个有效的结果,我不明白为什么它存在.如果它出现,据我所知,你有一个错误.期.

您希望程序崩溃并在那里死亡,以便您可以轻松找到出错的地方.这不是让程序运行失败,而是可能写入损坏的数据,可能发送损坏的数据,或做各种令人讨厌的事情 - 在不可避免地崩溃之前.(如"实用程序员"中所述 - 崩溃,不要垃圾")

现在,我相信IEEE 754的设计师比我聪明得多,这让我相信它是其存在的理由.这是什么原因?

Mor*_*eno 2

每当我写一些关于数学的东西时,我都害怕被真正的数学家用金属棒打倒,但我们来吧,面对我们的恐惧:

\n\n
\n

“为什么 NaN 存在,而不是导致异常或错误?”

\n
\n\n

因为它既不是异常也不是错误。这是一个完全有效的计算结果。在数学中有几个用例,您收到的相当于“NaN”,即无法测量的东西。考虑两条平行线之间的交点的计算。或者计算光子的质量

\n\n

在这些情况下,如果您要在代码中寻求“生活的数学方面”(我可以想象这主要适用于科学软件),我们会遇到以下情况:

\n\n
    \n
  • 它们没有错误,变量具有它们需要的值,计算已经完成,这就是结果。遗憾的是,这不是一个实数(也许是一个复数?也许是一个可以用其他数学方法解决的不确定性?),但你仍然有计算的答案。
  • \n
  • 它们也不例外,您的代码没有任何问题,这不是异常情况,这就是答案:“NaN”(您期望 42?)。无需在这里停止程序流程:通知用户计算没有解决方案或它是一个未确定的解决方案,并让他对此感到满意(注意:我撒了一点谎,请阅读最新的一段)。
  • \n
\n\n
\n

您希望程序当场崩溃并死掉,以便您可以轻松地找到出错的地方。

\n
\n\n

你是完全正确的:如果 NaN 的概念在你的程序上下文中不是有效结果,你仍然可以将其作为异常或错误处理。想象一下计算足球场的柱子的必要直径并得到 NaN。呃...这肯定是一个错误,我想建造那个体育场,给我一个直径!。你也完全错了:请不要\xc2\xb4t告诉你会“轻松”找到出错的地方,只是因为你在 NaN 之后触发了异常。我知道有些人正在调试气象模型,他们想和你谈谈(这些方程并不有趣)。

\n\n

现在有许多库和实现对什么是错误、什么是异常等做出固执己见的决定。IEEE 设计者将决定权留给了你。语言程序员将这种力量传递给了你。明智地使用它。

\n\n

如果你读到这里,让我告诉你,为了过于简单化,我对你撒了一点谎。IEEE linked 定义了两种 NaN,安静的 NaN 和信号 NaN。我一直在谈论安静的人、好人。信号将导致软件异常(上溢、下溢等)。

\n