【发布时间】:2018-02-21 22:27:33
【问题描述】:
我在我的测试套件中包含了check for nan's。
现在在下面一行抛出一个 SIGFPE
const double retVal =exp(exponent);
指数的值大约为 -4000。这当然非常接近于零,如果没有 nan 检查,计算会以零继续进行。
信号 SIGFPE 现在被抛出。我假设这是一个denormal number(表示为 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;
}
这会编译,但不会抛出信号或错误消息。
【问题讨论】:
-
根据this
std::expreference,double参数的有效范围是 -708.4 到 709.8。您的指数显然超出了该范围,也可能超出了long double的范围。 -
但也说明
If the argument is -∞, +0 is returned。 -inf 和 -708.4 之间的差距是什么?