繁体   English   中英

C,用IF语句进行错误处理

[英]In C, error handling with an IF statement

我需要修复一些代码

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

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

Try and catch out 因为这是 C 而不是 C++,setjmp 和 longjmp 似乎只有在你可以自己“抛出”错误时才有效(我还没有看到任何例子是程序导致了触发它的错误)

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

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

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

欢迎任何其他想法

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

此外, abs是一个int function。对于浮点绝对值,使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM