我正在开发一个安全关键的嵌入式程序(在C中),我希望使用IEEE 754浮点算法(使用NaN和Infs)进行工程计算。在这里,我有两种方法(afaik)来处理浮动 点异常:
忽略异常,并检查最终结果是否为有限数(sucsessfull计算)或NaN,inf(计算失败)。此解决方案具有更强的容错能力,但由于输出更具风险 可能不小心被排除在支票之外。
答案 0 :(得分:1)
在安全关键系统中哪个更好取决于系统,没有更多信息就无法回答。
另一种选择是设计浮点代码,以便不会出现不希望的行为(或者可以根据需要进行处理)并编写证明。
通常,检查最终值不足以检测计算过程中是否发生异常或其他错误。
关于3,考虑到后续操作中各种异常结果可能会消失。当用作除数时,无穷大可以产生零。 NaN在一些最小或最大的实现中消失。 (例如,max(3, NaN)
可能产生3而不是NaN。)分析代码可能(或可能不会)揭示在特定计算中这些事情是否可能。
但是,检查最终值的替代方法是检查异常标志。 IEEE 754的大多数实现都具有累积标志 - 一旦发生异常,其标志就会被提升并保持上升直到显式重置。因此,您可以在计算开始时清除标记并在结束时测试它们,并且,与测试最终值不同,这将保证您在发生异常后观察它们。