我需要修复一些具有的代码
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实现将继续。在对b
和a/b
执行除法之前,应该测试它们是否为零,还应该考虑其他感兴趣的条件,例如NaN。例如,如果a/b
和c/d
溢出,您的计算将导致将NaN与.1
进行比较,结果将为false,因此代码将无法检测到这一点,但您可能希望将其视为错误。
此外,abs
是int
函数。对于浮点绝对值,使用fabsf
、fabs
或fabsl
作为float
、double
或long 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);