数値アプリケーションで、計算終了後に浮動小数点例外が発生したかどうかを知りたいです。デフォルトでは、浮動小数点の除算と無効な演算は黙って無視されます。
私の試みは、気になる FPE を有効にし、フラグを設定して SIGFPE を処理し、再度無効にして実行を継続できるようにすることです。
#include <fenv.h>
#include <signal.h>
#include <stdio.h>
int caught = 0;
struct sigaction old_sa;
/* (2) */ fenv_t fenv_hold;
void sighandler()
{
caught = 1;
printf("Caught in handler, disabling\n");
/* (1) */ fedisableexcept(FE_ALL_EXCEPT);
/* (2) */ feholdexcept(&fenv_hold);
sigaction(SIGFPE, &old_sa, NULL);
}
int main(void)
{
struct sigaction sa;
volatile double a=1, b=0;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = sighandler;
sigaction(SIGFPE, &sa, &old_sa);
feenableexcept(FE_DIVBYZERO);
printf("Dividing by zero..\n");
a/=b;
printf("Continuing\n");
}
私は 2 つのアプローチを取り(1)
ました(2)
。どちらも期待どおりに機能しません。
出力:
Dividing by zero..
Caught in handler, disabling
Floating point exception (core dumped)
期待される出力:
Dividing by zero..
Caught in handler, disabling
Continuing