我在我的测试套件中包含了对 nan 的检查。
现在在以下行抛出一个 SIGFPE
const double retVal =exp(exponent);
指数的值约为 -4000。这当然非常接近于零,如果没有 nan 检查,计算会以零继续进行。
现在抛出信号 SIGFPE。我假设这是一个非正规数(表示为 NAN)。
如何区分除以零和负值非常大的指数?
在第二种情况下,在我的情况下,用零进行进一步计算是可行的,因为我不需要区分 +0 和 -0。
编辑:我尝试了@user2079303 的建议。我的代码看起来像这样
#include <signal.h>
void fpe_handler(int signo, siginfo_t *info, void *context) {
switch(info->si_code) {
case FPE_INTDIV: // division by zero
break;
case FPE_FLTUND: // underflow
break;
// other cases ...
}
}
int main() {
struct sigaction action = {};
action.sa_flags = SA_SIGINFO;
action.sa_sigaction = fpe_handler;
sigaction(SIGFPE, &action, NULL);
const double a = 0.0/0.0;
if (a>0)
return 0;
else
return 1;
}
这会编译,但不会抛出信号或错误消息。