为什么NaN存在?

时间:2018-12-11 08:45:03

标签: floating-point nan ieee-754

我不是在问“为什么计算结果会以NaN表示”,我是在问“为什么NaN完全存在,而不是导致异常或错误?”

我一直想知道这一点,并偶尔与人们讨论。

我唯一得到的答案是“那么,您不想尝试捕捉每个除法操作,是吗?” ”在某些情况下,NaN是有效结果”。

话虽这么说,但我从未收到过NaN是有效结果的具体示例。假设NaN永远不可能是一个有效的结果,我根本不理解为什么它存在。据我所知,如果它出现了,那么您就有一个错误。期。

您希望程序崩溃然后在那儿死掉,以便您可以轻松找到问题出在哪里。在不可避免地崩溃之前,这不是让程序正常运行,可能写入损坏的数据,可能发送损坏的数据或进行各种令人讨厌的事情。 (如“实用程序员”中所述-崩溃,不要破坏”)

现在,我相信IEEE 754设计师比我聪明得多,这使我相信存在HA是其存在的原因。这是什么原因?

1 个答案:

答案 0 :(得分:2)

每当我写一些关于数学的东西时,我都会害怕被真正的数学家用金属棒击倒,但是在这里,我们正面临着我们的恐惧:

  

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

因为它既不是异常也不是错误。对于计算而言,这是一个完全有效的结果。您在数学中有几个用例,它们收到的等价于“ NaN”,即无法测量的东西。考虑两条平行线之间的交点的计算。或the calculation of the mass of a photon

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

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

您希望程序崩溃然后死机,以便您可以   轻松找到问题所在。

您完全正确:如果NaN的概念在程序上下文中不是有效的结果,您仍然可以将其作为异常或错误来处理。。想象一下计算必要的直径足球场的专栏并获得NaN。 gh ...那肯定是错误的,我想建造那个体育场,给我一个直径!您也完全错了:请不要告诉您,在NaN之后触发异常会“轻易”找到错误的出处。我知道有些人正在调试气象模型,希望与您谈谈(这些方程式很不好玩)。

如今,您拥有许多库和实现,这些库和实现针对什么是错误,什么是异常等做出了明智的决定。IEEE设计师将决定留给您。语言编码人员将这种能力传递给了您。明智地使用它。

如果您读到这里,请允许我告诉您,为了简化起见,我在对您说谎。 IEEE链接定义了两种NaN,静默的和信令的。我一直在谈论安静的人,好人。 发信号的信号会导致您的软件出现异常(上溢,下溢等)。