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

Exception 是否存在由浮点溢出引起的已知安全问题?,exception,floating-point,overflow,ieee-754,Exception,Floating Point,Overflow,Ieee 754,IEEE754标准似乎通过引入无穷大表示法来传递浮点溢出。在我看来,浮点数比整数更能容忍溢出。我的问题是,浮点溢出有多危险?是否存在未检测到的浮点溢出导致的已知安全问题 (众所周知的Ariane 5爆炸是由double->long int转换引起的,这不是这里讨论的正确的浮点溢出。)在需要高安全级别的情况下,您应该检查所有可能对结果产生重大影响的错误。这听起来有些重复,但仍然是主要原则,没有人能从他的侧面告诉你更多,除非深入挖掘细节。但一些通用配方仍然可以表达。特别是,如果你得到了INF结果,这

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


(众所周知的Ariane 5爆炸是由double->long int转换引起的,这不是这里讨论的正确的浮点溢出。)

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

请记住,IEEE754是IEEE标准,因此,它适用于易于硬件实现,至少适用于基本操作,以及所有相关特性和限制。有些情况下IEEE754不能令人满意:这包括更高的精度、可变精度(参见“较短精度的舍入”==“冯·诺依曼舍入”)、用于错误跟踪的区间算法等。对于它们,应使用软件实现

但是,IEEE754仍然提供了一些措施来覆盖最常见的案例集。它支持所有中间操作的“异常”(这里已经知道,值为INF和NaN),对于不能提供结果但仍然可以快速廉价地表示差异的情况。如果你关心计算中所有可能的问题,你至少应该

  • 计算前清除例外情况
  • 计算
  • 检查两个:最终值(在您确定这符合您的情况之前,都不能是INF或NaN)和异常(至少:溢出、除以0、域错误)
再说一次,这并不涵盖所有情况,但通常情况下,大多数情况下都是如此

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

(著名的Ariane 5爆炸是由double->long int转换引起的,这里讨论的不是一个合适的浮点溢出。)


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

IEEE 754不是硬件实现的专用工具。IEEE 754-2008第二页:“符合本标准的浮点系统的实现可以完全通过软件、硬件或任何软件和硬件的组合来实现。”这在第1页得到了回应。IEEE 754在编程环境中指定浮点算法,而不是硬件要求。@EricPostphil谢谢,Cap。这里没有人说“独占”,但你不能反对它是为了便于硬件实现而修改的。为了清晰起见,在答案中更新了这个。