Changes between Initial Version and Version 1 of Dev/assembly/x86


Ignore:
Timestamp:
Dec 1, 2010 8:15:58 PM (14 years ago)
Author:
mitty
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Dev/assembly/x86

    v1 v1  
     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> 
     11int main(void) 
     12{ 
     13  std::cout << 10.0 / 0.0 << std::endl; 
     14  return 0; 
     15} 
     16% g++ test.cc 
     17test.cc: In function `int main()': 
     18test.cc:4: 警告: division by zero in `1.0e+1 / 0.' 
     19% ./a.out 
     20inf 
     21% 
     22}}} 
     23   1. 一方,整数で 10 / 0 を実行すると... 次の例のように floating point exception が発生します. 
     24{{{ 
     25% cat test.cc 
     26#include <iostream> 
     27int main(void) 
     28{ 
     29  std::cout << 10 / 0 << std::endl; 
     30  return 0; 
     31} 
     32% g++ test.cc 
     33test.cc: In function `int main()': 
     34test.cc:4: 警告: division by zero in `10 / 0' 
     35% ./a.out 
     36zsh: 28997 floating point exception  ./a.out 
     37% 
     38}}} 
     39   1. 当然これは signal(7) の SIGFPE のことです.前者の例から考えると,浮動小数点の 0 除算では「本当の」SIGFPE は発生しないでしょうから,私が推測する理由は次のようなものです.「UNIX がよく稼働する Sparc では,整数の 0 除算も浮動小数点例外として処理していて,Linux は i386 への実装の際,できるだけ近い実装となるようにした」 
     40