在C语言中,用IF语句处理错误



我需要修复一些具有的代码

if ( abs(( (a/b) - (c/d) ) / (a/b)) > 0.1) { ... 

这是检查的一部分,以确定这些值是否合理。否则,它将重新查询值。事先会进行检查,以确保它在任何点都不会被零除,但该方程有时会出现浮点下溢错误。我正试图找出一种运行该程序的方法,以消除任何可能的错误。

Try-and-catch已经过时了,因为这是在C而不是C++中,setjmp和longjmp似乎只有在你自己可以"抛出"错误的情况下才有效(我没有看到任何例子是程序导致触发它的错误)

我的解决方案可以编译,但很难测试(因为它是整个系统的一部分):

if (val = abs(( (a/b) - (c/d) ) / (a/b)){
if (val > 0.1) {

如果"If"语句中的语句试图抛出错误,它会停止程序还是跳过If语句?

任何其他想法欢迎

当浮点除以零时,根据操作数的不同,结果设置为+∞、-∞或NaN时,通用C实现将继续。在对ba/b执行除法之前,应该测试它们是否为零,还应该考虑其他感兴趣的条件,例如NaN。例如,如果a/bc/d溢出,您的计算将导致将NaN与.1进行比较,结果将为false,因此代码将无法检测到这一点,但您可能希望将其视为错误。

此外,absint函数。对于浮点绝对值,使用fabsffabsfabsl作为floatdoublelong double

如果'If'语句中的语句试图抛出错误,它会停止程序还是跳过If语句?

假设表达式在外部if条件中的行为首先被定义,唯一的替代方案是它计算为浮点值(可能是无穷大或NaN),或者它执行陷阱。

后者是我对你所说的";抛出错误";,如果程序执行了一个陷阱,那么根据定义,它会立即中断程序的执行(但不一定没有继续的可能性)。这与执行陷阱的上下文完全无关。

浮点下溢并不是大多数系统的默认行为,它会导致陷阱,但许多系统提供了在这种特殊FP条件下启用陷阱的可能性。一种选择是简单地关闭它,至少在评估这种情况时是这样。它可能看起来像这样:

#include <fenv.h>
#pragma STDC FENV_ACCESS ON
// ...
fenv_t env;
// Preserve the current FP environment and set a mode that prevents trapping
// when FP exceptions are raised.
feholdexcept(&env);
if ( abs(( (a/b) - (c/d) ) / (a/b)) > 0.1) {
// ... 
}
// Restore the FP environment
fesetenv(&env);

最新更新