0

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

  • 如果发生任何异常,则进入永久故障状态。从错误检测的角度来看,这可能更健壮,但对容错/可用性不利。
  • 忽略异常,并检查最终结果是有限数(成功计算)还是 NaN、inf(计算失败)。此解决方案具有更高的容错性,但风险更大,因为输出可能会意外地从检查中排除。

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

1 回答 1

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

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

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

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

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

于 2012-10-18T23:42:43.257 回答