【发布时间】:2019-05-12 05:16:07
【问题描述】:
我不是在问“为什么这个计算结果是 NaN”,我是在问“为什么 NaN 存在,而不是导致异常或错误?”
我一直在想这个问题,并偶尔与人们讨论它。
我得到的唯一答案是 “你不想尝试捕获每个除法运算,是吗?” 或 “在某些情况下 NaN 是一个有效的结果”。
话虽如此,我从未收到 NaN 是有效结果的具体示例。假设 NaN 永远不可能是一个有效的结果,我不明白它为什么存在。如果它出现,据我所知,你有一个错误。时期。
您希望程序崩溃并死机,以便您可以轻松找到出错的地方。这不是让程序乱跑,可能会写入损坏的数据,可能会发送损坏的数据,或者做各种讨厌的事情——在不可避免的崩溃之前。 (正如《务实的程序员》中所说——Crash, Don't Trash)
现在,我相信IEEE 754 的设计师比我聪明得多,这让我相信它的存在是有原因的。这是什么原因?
【问题讨论】:
-
一方面,异常处理通常很慢,因此欢迎选择不使用它来处理一些简单的
NaN情况的代码。此外,C 中没有异常处理。 -
原因可以在这里找到:stackoverflow.com/questions/2618059/in-java-what-does-nan-mean。它用于 IEEE 754 算术上未定义的值,例如 0/0 除法。
-
@πάνταῥεῖ 我不确定这怎么可能太宽泛了。这是一个关于 IEEE 754 设计决策的明确问题,值得商榷。五分钟的谷歌搜索对我来说只导致了一个半途而废的论点。 “1985 年没有例外”的理由并不令人信服;有信号。
-
“而不是导致异常”是关键,异常是有争议的。上个世纪的一场灾难,将期望启用异常的库与期望禁用它的库混在一起是一场噩梦。取得成功的唯一真正方法是禁用它们并让 NaN 完成它的工作。如果你有勇气,你可以推翻这个选择。
标签: floating-point nan ieee-754