我不是在问“为什么计算结果会以NaN表示”,我是在问“为什么NaN完全存在,而不是导致异常或错误?”
我一直想知道这一点,并偶尔与人们讨论。
我唯一得到的答案是“那么,您不想尝试捕捉每个除法操作,是吗?” 或”在某些情况下,NaN是有效结果”。。
话虽这么说,但我从未收到过NaN是有效结果的具体示例。假设NaN永远不可能是一个有效的结果,我根本不理解为什么它存在。据我所知,如果它出现了,那么您就有一个错误。期。
您希望程序崩溃然后在那儿死掉,以便您可以轻松找到问题出在哪里。在不可避免地崩溃之前,这不是让程序正常运行,可能写入损坏的数据,可能发送损坏的数据或进行各种令人讨厌的事情。 (如“实用程序员”中所述-崩溃,不要破坏”)
现在,我相信IEEE 754设计师比我聪明得多,这使我相信存在HA是其存在的原因。这是什么原因?
答案 0 :(得分:2)
每当我写一些关于数学的东西时,我都会害怕被真正的数学家用金属棒击倒,但是在这里,我们正面临着我们的恐惧:
“为什么NaN根本不存在,而不是导致异常或错误?”
因为它既不是异常也不是错误。对于计算而言,这是一个完全有效的结果。您在数学中有几个用例,它们收到的等价于“ NaN”,即无法测量的东西。考虑两条平行线之间的交点的计算。或the calculation of the mass of a photon。
在这些情况下,您将在代码中追求“生活的数学方面”(我可以想象这主要适用于科学软件),我们遇到以下情况:
您希望程序崩溃然后死机,以便您可以 轻松找到问题所在。
您完全正确:如果NaN的概念在程序上下文中不是有效的结果,您仍然可以将其作为异常或错误来处理。。想象一下计算必要的直径足球场的专栏并获得NaN。 gh ...那肯定是错误的,我想建造那个体育场,给我一个直径!您也完全错了:请不要告诉您,在NaN之后触发异常会“轻易”找到错误的出处。我知道有些人正在调试气象模型,希望与您谈谈(这些方程式很不好玩)。
如今,您拥有许多库和实现,这些库和实现针对什么是错误,什么是异常等做出了明智的决定。IEEE设计师将决定留给您。语言编码人员将这种能力传递给了您。明智地使用它。
如果您读到这里,请允许我告诉您,为了简化起见,我在对您说谎。 IEEE链接定义了两种NaN,静默的和信令的。我一直在谈论安静的人,好人。 发信号的信号会导致您的软件出现异常(上溢,下溢等)。