哪种方法可以处理嵌入式代码中的浮点异常?

时间:2012-10-18 20:59:43

标签: c floating-point-exceptions

我正在开发一个安全关键的嵌入式程序(在C中),我希望使用IEEE 754浮点算法(使用NaN和Infs)进行工程计算。在这里,我有两种方法(afaik)来处理浮动 点异常:

    如果发生任何异常,
  • 进入永久性故障状态。从错误检测的角度来看,这可能更强大,但对容错/可用性不利。
  • 忽略异常,并检查最终结果是否为有限数(sucsessfull计算)或NaN,inf(计算失败)。此解决方案具有更强的容错能力,但由于输出更具风险 可能不小心被排除在支票之外。

    1. 哪个是安全关键系统的更好解决方案?
    2. 还有其他选择吗?
    3. 如果计算的复杂性不允许第一个解决方案(我不能避免正常使用中的异常)是最终的检查还是其他方面我应该考虑?

1 个答案:

答案 0 :(得分:1)

  1. 在安全关键系统中哪个更好取决于系统,没有更多信息就无法回答。

  2. 另一种选择是设计浮点代码,以便不会出现不希望的行为(或者可以根据需要进行处理)并编写证明。

  3. 通常,检查最终值不足以检测计算过程中是否发生异常或其他错误。

  4. 关于3,考虑到后续操作中各种异常结果可能会消失。当用作除数时,无穷大可以产生零。 NaN在一些最小或最大的实现中消失。 (例如,max(3, NaN)可能产生3而不是NaN。)分析代码可能(或可能不会)揭示在特定计算中这些事情是否可能。

    但是,检查最终值的替代方法是检查异常标志。 IEEE 754的大多数实现都具有累积标志 - 一旦发生异常,其标志就会被提升并保持上升直到显式重置。因此,您可以在计算开始时清除标记并在结束时测试它们,并且,与测试最终值不同,这将保证您在发生异常后观察它们。