是否存在由浮点溢出引起的已知安全问题?

Are there known safety issues caused by floating-point overflow?

IEEE754 标准似乎通过引入无穷大表示来让浮点溢出通过。在我看来,浮点数比整数更能容忍溢出。我的问题是,浮点溢出有多危险?是否存在未检测到的浮点溢出导致的已知安全问题?

(著名的阿丽亚娜5号爆破是double->long int转换引起的,不是这里讨论的妥妥的浮点数溢出。)

在需要高安全级别的情况下,您应检查所有可能对结果产生重大影响的错误。这听起来像是同义反复,但仍然是主要原则,没有人可以从他的侧面告诉你更多,而不深入细节。但是一些通用的recipe还是可以表达的。特别是,如果你的结果是 INF,这很可能意味着你根本没有结果,因为你不知道这个无穷大出现的时间有多早,所以,整个结果应该被丢弃。 NaN也是一样。

请记住 IEEE754 是 IEEE 标准,因此,它是为了便于 硬件 实施,至少对于基本操作,以及所有相关的特性和限制。在某些情况下 IEEE754 不能令人满意:这包括更高的精度、可变精度(参见 "rounding for shorter precision" == "von Neumann rounding")、错误跟踪的区间算法等。对于他们,应使用软件实现。

但是,IEEE754 仍然提供了一些措施来覆盖最常见的案例集。它支持 "exceptions" 用于所有中间操作(并且,正如此处已知的那样,值为 INF 和 NaN),对于无法提供结果但仍然可以在 fast 中表达差异的情况 便宜 方式。如果你关心所有可能出现的计算问题,你至少应该

  • 计算前清除异常
  • 做计算
  • 同时检查:最终值(在您确定这适合您的情况之前不得为 INF 或 NaN)和异常(至少:溢出、除以 0、域错误)。

再说一遍,这并没有涵盖所有情况,但通常是大多数情况。

下溢和不精确异常是否值得您关注,这取决于具体情况。大多数不精确异常的情况都是不可避免的,在与物理相关的计算中并不重要,但它们在十进制浮点数或定点金融计算中很关键。下溢可能是灾难性取消等严重问题的征兆。

(The well-known Ariane 5 explosion is caused by double -> long int conversion, which is not a proper floating-point overflow discussed here.)

实际结果没有主要区别 - 及时检测到溢出,但未处理相应的异常。