まず 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)