| 1 | [[PageOutline]] |
| 2 | |
| 3 | = SIGFPE = |
| 4 | * Floating point exception |
| 5 | * [http://fukumori.org/diary/20060615.html#p01 Rogue Engineer's Diary / やさぐれ日記(2006-06-15)] |
| 6 | * http://web.archive.org/web/20050702155253/http://cclub.cc.tut.ac.jp/~pakuchan/hoge/2004/9/28 |
| 7 | 1. 浮動小数点で 10.0 / 0.0 を実行すると,値は無限大になるだけで,別に浮動小数点例外が発生するようなことはなかったように記憶しています.試しにやってみると,手元の環境では次のようになりました. |
| 8 | {{{ |
| 9 | % cat test.cc |
| 10 | #include <iostream> |
| 11 | int main(void) |
| 12 | { |
| 13 | std::cout << 10.0 / 0.0 << std::endl; |
| 14 | return 0; |
| 15 | } |
| 16 | % g++ test.cc |
| 17 | test.cc: In function `int main()': |
| 18 | test.cc:4: 警告: division by zero in `1.0e+1 / 0.' |
| 19 | % ./a.out |
| 20 | inf |
| 21 | % |
| 22 | }}} |
| 23 | 1. 一方,整数で 10 / 0 を実行すると... 次の例のように floating point exception が発生します. |
| 24 | {{{ |
| 25 | % cat test.cc |
| 26 | #include <iostream> |
| 27 | int main(void) |
| 28 | { |
| 29 | std::cout << 10 / 0 << std::endl; |
| 30 | return 0; |
| 31 | } |
| 32 | % g++ test.cc |
| 33 | test.cc: In function `int main()': |
| 34 | test.cc:4: 警告: division by zero in `10 / 0' |
| 35 | % ./a.out |
| 36 | zsh: 28997 floating point exception ./a.out |
| 37 | % |
| 38 | }}} |
| 39 | 1. 当然これは signal(7) の SIGFPE のことです.前者の例から考えると,浮動小数点の 0 除算では「本当の」SIGFPE は発生しないでしょうから,私が推測する理由は次のようなものです.「UNIX がよく稼働する Sparc では,整数の 0 除算も浮動小数点例外として処理していて,Linux は i386 への実装の際,できるだけ近い実装となるようにした」 |
| 40 | |