在编程中进行数值计算时,开发者常常将整数运算的安全习惯迁移到浮点运算上。然而,这两种范式在处理错误和边界情况时遵循根本不同的方法。整数运算中,超出可表示范围的操作会导致未定义行为或程序崩溃,因此必须在操作发生之前预见并防止可能出现的问题。这种思维方式促使开发者实施对潜在溢出或下溢条件的预防性检查。
浮点运算遵循 IEEE-754 标准,对异常情况的处理方式有所不同。它不会立即导致失败,而是在超出范围或涉及无效输入时产生特殊值:NaN(非数字)用于诸如 0/0 这样的未定义结果,以及无穷大用于诸如除以零这样的溢出。这些值在后续计算中能够安全传播——例如,任何涉及 NaN 的操作结果仍为 NaN,而有限数除以无穷大得到零。这一封装特性意味着开发者通常可以在计算完成后验证结果,而无需事先防范每一种可能的错误条件。

此图像说明浮点除以零如何产生无穷大,这是一种能够安全传播的特殊值,支持文章关于事后验证的观点。
一个常见的错误说明了这种范式不匹配:使用 FLT_EPSILON(1.0 与下一个可表示浮点值之间的最小可表示差)来检查零分母。正如源材料所示,这种方法会失败,因为除法的成败取决于分子和分母的大小。一个较大的分子除以一个适中小的分母(如 0.9)仍可能产生无穷大,而一个中等分子除以极小的分母(如 FLT_EPSILON 的后继值)也可能得到无穷大。正确的做法是使用语言特定的函数(如 C 或 Rust 中的 isfinite())来检查计算结果是否为有限值,这种单一的验证步骤在操作完成后即可同时捕获 NaN 和无穷大。