読者です 読者をやめる 読者になる 読者になる

不正確例外でシグナルを発生させてみる

まず karetta の『Gaucheプログラミング(立読み版)』にある「正確数と非正確数」( http://karetta.jp/book-node/gauche-hacks/010883 )を見てください
IEEE 754 では、オペランドを正確数(浮動小数点表現ですが、厳密にその値であるとみなす)であるとした時、得られた結果が非正確であるような演算、たとえば 1.0/3.0 のような演算をしたような場合についての例外「不正確例外」を定めています
この例外は頻繁に起きるものですので、通常は FPU 内部のフラグがセットされるのみで、シグナルは発生しません。これを、C言語のコードから発生させてみます
まず、最適化避け用の、double を引数に取るダミー(printf で表示するのは printf 内部での浮動小数点処理でひっかかるため不可)

/* dummy.c */
void dummy(double _){}

C99 では、こういった浮動小数点関係の詳細も標準化されましたので、それを使います

/* sample.c */
#include <stdlib.h>

#include <fenv.h>

void dummy(double);

int
main(int argc, char *argv[])
{
  if (argc != 2) {
    exit(1);
  }
  {
    double b = (double)atoi(argv[1]);
    feenableexcept(FE_INEXACT);
    dummy(1.0 / b);
  }
  exit(0);
}

fenv.h が標準のヘッダ、feenableexcept(FE_INEXACT) によりプロセッサの例外になるように設定しています。コンパイルして実行すると以下のようになります

$ gcc -c dummy.c
$ gcc sample.c dummy.o -lm
$ ./a.out 1
$ ./a.out 2
$ ./a.out 3
Floating point exception: 8 (core dumped)
$ ./a.out 4
$ ./a.out 5
Floating point exception: 8 (core dumped)
$ ./a.out 6
Floating point exception: 8 (core dumped)
$ ./a.out 7
Floating point exception: 8 (core dumped)
$ ./a.out 8
$ ./a.out 9
Floating point exception: 8 (core dumped)