¿ôÃÍ·×»»¥¬¥¤¥É ¥Û¡¼¥àÌܼ¡Á°¥Ú¡¼¥¸¤Ø¼¡¥Ú¡¼¥¸¤Øº÷°ú


Âè 4 ¾Ï

Îã³°¤ÈÎã³°½èÍý

¤³¤Î¾Ï¤Ç¤Ï¡¢IEEE ¤ÎÉâÆ°¾®¿ôÅÀÎã³°¤È¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤Î¸¡½Ð¡¢ÆÃÄê¡¢½èÍý¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£

SPARC¡¢x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Î Sun WorkShop 6 Compiler ¤ª¤è¤Ó Solaris ¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤ÇÄ󶡤µ¤ì¤ëÉâÆ°¾®¿ôÅÀ´Ä¶­¤Ç¤Ï¡¢IEEE ɸ½àµ¬³Ê¤ÇÄê¤á¤é¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤ÎÎã³°½èÍýµ¡Ç½¡¢¤ª¤è¤Ó¤½¤Î¾¤Î¿ä¾©¤µ¤ì¤Æ¤¤¤ëµ¡Ç½¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£IEEE ɸ½à¤ÎÌÜŪ¤Î 1 ¤Ä¤Ï¡¢¡ÖIEEE 854 ɸ½àµ¬³Ê¡×¤Î¼¡¤ÎÉôʬ¤Ç½Ò¤Ù¤é¤ì¤Æ¤¤¤Þ¤¹ (IEEE 854 ɸ½àµ¬³Ê¤Î 18 ¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£

... ¥æ¡¼¥¶¡¼¤Î¤¿¤á¤Ë¡¢Îã³°¾ò·ï¤ÎȯÀ¸¤Ëȼ¤¦Ê£»¨¤Ê½èÍý¤òºÇ¾®¸Â¤ËÍÞ¤¨¤ë¤³¤È¤Ç¤¹¡£»»½Ñ¥·¥¹¥Æ¥à¤Ï¡¢¤Ç¤­¤ë¤À¤±Ä¹»þ´Ö¤ËÅϤäƷ׻»¤ò³¹Ô¤¹¤ë¤³¤È¤òÌÜŪ¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¹¤Ê¤ï¤Á¡¢°Û¾ï¤Ê»öÂÖ¤¬È¯À¸¤·¤Æ¤â¡¢Å¬Àڤʥե饰¤òÀßÄꤹ¤ë¤Ê¤É¡¢¹çÍýŪ¤Ê¥Ç¥Õ¥©¥ë¥È¤Î±þÅú¤Ë¤è¤Ã¤ÆÂнè¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

ɸ½àµ¬³Ê¤Ç¤Ï¡¢Îã³°±é»»¤ËÂФ¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬¸¡½Ð¡¢ÀßÄê¡¢¥¯¥ê¥¢¤¹¤ë¤³¤È¤Ë¤è¤Ã¤ÆÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤¹¥¹¥Æ¡¼¥¿¥¹¥Õ¥é¥°¤ò¼ÂÁõ¤¹¤ëɬÍפ¬¤¢¤ë¤È¤·¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢Îã³°¤¬È¯À¸¤·¤¿»þ¤Ë¡¢¥Ö¥í¥Ã¥¯¤ò¥È¥é¥Ã¥×¤¹¤ë (Ä̾ï¤ÎÀ©¸æ¥Õ¥í¡¼¤òÃæÃǤ¹¤ë) ÊýË¡¤ò¼ÂÁõ¤¹¤ë¤³¤È¤â¿ä¾©¤·¤Æ¤¤¤Þ¤¹¡£

Îã³°±é»»¤ËÂåÂؤηë²Ì¤òÅϤ·¤Æ¼Â¹Ô¤òºÆ³«¤¹¤ë¤Ê¤É¡¢¥×¥í¥°¥é¥à¤ÇŬÀÚ¤ÊÊýË¡¤ÇÎã³°¤ò½èÍý¤¹¤ë¥È¥é¥Ã¥×¥Ï¥ó¥É¥é¤òÍÑ°Õ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾Ï¤Ç¤Ï¡¢IEEE 754 ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ëÎã³°¡¢¤½¤Î¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¡¢¥¹¥Æ¡¼¥¿¥¹¥Õ¥é¥°¡¢¥È¥é¥Ã¥×¡¢Îã³°½èÍý¤ò¥µ¥Ý¡¼¥È¤¹¤ëÉâÆ°¾®¿ôÅÀ´Ä¶­¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£

Îã³°¤È¤Ï

Îã³°¤ÎÄêµÁ¤Ïº¤Æñ¤Ç¤¹¤¬¡¢W.Kahan ¤Ë¤è¤ë¤È°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹ (W.Kahan Ãø¡ØHandling Arithmetic Exceptions¡Ù¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£

»»½Ñ±é»»Îã³°¤Ï¡¢ÉÔ²Äʬ (atomic) ¤Ê»»½Ñ±é»»¤Î·ë²Ì¤¬¡¢°ìÈ̤˼õ¤±Æþ¤ì²Äǽ¤Ê¤â¤Î¤Ç¤Ê¤¤¤È¤­¤ËȯÀ¸¤·¤Þ¤¹¡£¡ÖÉÔ²Äʬ¤Ê¡×¤ª¤è¤Ó¡Ö¼õ¤±Æþ¤ì²Äǽ¤Ê (acceptable)¡×¤Î°ÕÌ£¤Ï¾ì¹ç¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£

Éé¿ô¤ÎÊ¿Êýº¬¤ò¼è¤í¤¦¤È¤¹¤ë¤Î¤ÏÎã³°¤Ç¤¢¤ê¡¢Ä̾ï¤Ï̵¸ú¤Ê±é»»¤Ë¤è¤Ã¤Æ°ú¤­µ¯¤³¤µ¤ì¤¿Îã³°¤È¸«¤é¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥·¥¹¥Æ¥à¤Ç¤Ï°Ê²¼¤Î¤¦¤Á¤Î¤¤¤º¤ì¤«¤Î¤³¤È¤¬¤é¤¬µ¯¤³¤ê¤Þ¤¹¡£

IEEE ¤ÎÉâÆ°¾®¿ôÅÀÎã³°¤Ï¡¢Ìµ¸ú¤Ê±é»»¡¢¥¼¥í½ü»»¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¤ª¤è¤ÓÉÔÀµ³Î¤Î 5 ¼ïÎब¤¢¤ê¤Þ¤¹¡£ºÇ½é¤Î 3 ¤Ä (̵¸ú¤Ê±é»»¡¢¥¼¥í½ü»»¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼) ¤ÎÎã³°¤Ï¶¦Ä̤ÎÎã³°¤È¸Æ¤Ð¤ì¤Æ¤ª¤ê¡¢Ìµ»ë¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ieee_handler(3m) ¤Ë¤Ï¶¦Ä̤ÎÎã³°¤À¤±¤ò¥È¥é¥Ã¥×¤¹¤ë´Êñ¤ÊÊýË¡¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£Â¾¤Î 2 ¤Ä¤ÎÎã³° (¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢ÉÔÀµ³Î) ¤Ï¤è¤êÉÑÈˤËȯÀ¸¤·¤Þ¤¹¡£¼ÂºÝ¡¢¤Û¤È¤ó¤É¤ÎÉâÆ°¾®¿ôÅÀ±é»»¤ËÉÔÀµ³ÎÎã³°¤òȯÀ¸¤·¤Æ¤ª¤ê¡¢¤Û¤È¤ó¤É¤Î¾ì¹ç¤Ï̵»ë¤Ç¤­¤Þ¤¹¡£

ɽ 4-1 ¤Ï IEEE ɸ½àµ¬³Ê 754 ¤ÎÆâÍƤòÍ×Ìó¤·¤¿¤â¤Î¤Ç¤¹¡£5 ¼ïÎà¤ÎÉâÆ°¾®¿ôÅÀÎã³°¤ª¤è¤ÓÎ㳰ȯÀ¸»þ¤Î IEEE ±é»»µ¡Ç½´Ä¶­¤Î¥Ç¥Õ¥©¥ë¥È¤Î±þÅú¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£

ɽ 4-1   IEEE ÉâÆ°¾®¿ôÅÀÎã³°  
IEEE Îã³°
Îã³°¤ÎȯÀ¸Íýͳ
Îã
¥È¥é¥Ã¥×̤ÀßÄê»þ¤Î
¥Ç¥Õ¥©¥ë¥È·ë²Ì
̵¸ú¤Ê±é»» ¼Â¹Ô¤·¤è¤¦¤È¤¹¤ë±é»»¤ËÂФ·¤Æ¥ª¥Ú¥é¥ó¥É¤¬Ìµ¸ú 0 ×
0/ 0
/
X REM 0
¥·¥°¥Ê¥ë¤òȯÀ¸
¤·¤Ê¤¤ NaN

(x86 ¤Ç¤Ï¡¢ÉâÆ°¾®¿ôÅÀ¥¹¥¿¥Ã¥¯¤¬¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¹¤ë¾ì¹ç¤Ë¤â¤³¤ÎÎã³°¤¬È¯À¸¤¹¤ë¡£¤·¤«¤·¡¢¤³¤Î¤³¤È¤Ï IEEE µ¬³Ê¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤)
Éé¤Î¥ª¥Ú¥é¥ó¥É¤ÎÊ¿Êýº¬
¥·¥°¥Ê¥ë¤òȯÀ¸¤¹¤ë NaN ¥ª¥Ú¥é¥ó¥É¤ò»ý¤ÄǤ°Õ¤Î±é»»
Èó½ç½øÉÕ¤±Èæ³Ó (Ãí 1 ¤ò»²¾È)
̵¸ú¤ÊÊÑ´¹ (Ãí 2 ¤ò»²¾È)

¥¼¥í¤Ë¤è¤ë½ü»»
Í­¸Â¥ª¥Ú¥é¥ó¥É¤ËÂФ¹¤ë±é»»¤Ë¤è¤ê·ë²Ì¤¬½ã̵¸Â¿ô¤È¤Ê¤Ã¤Æ¤¤¤ë
Í­¸Â¤Ç¥¼¥í¤Ç¤Ê¤¤ x ¤ËÂФ¹¤ë
x /0
log(0)

Àµ¤·¤¤Éä¹æ¤Î̵¸ÂÂç
¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ Àµ¤·¤¯´Ý¤á¤ò¹Ô¤Ê¤Ã¤¿·ë²Ì¡¢°ÜÆ°Àè¤Î·Á¼°¤Çɽ¸½²Äǽ¤ÊºÇÂç¿ô¤òĶ¤¨¤Æ¤¤¤ë (»Ø¿ôÉôʬ¤òĶ¤¨¤¿) ÇÜÀºÅÙ:
DBL_MAX + 1.0e294
exp(709.8)
ñÀºÅÙ:
(float)DBL_MAX
FLT_MAX
+ 1.0e32
expf(88.8)
´Ý¤á¥â¡¼¥É (RM) ¤ÈÃæ´Ö·ë²Ì¤ÎÉä¹æ¤Ë°Í¸¤¹¤ë
¥¢¥ó¥À¡¼¥Õ¥í¡¼ Àµ³Î¤Ê·ë²Ì¡¢Àµ¤·¤¯´Ý¤á¤é¤ì¤¿·ë²Ì¤Î¤É¤Á¤é¤â¡¢°¸Àè¤Î·Á¼°¤Çɽ¸½²Äǽ¤ÊºÇ¾®¤ÎÀµµ¬¿ô¤è¤ê¤âÀäÂÐÃͤ¬¾®¤µ¤¤ (Ãí 3 ¤ò»²¾È)
ÇÜÀºÅÙ¡§
nextafter(min_normal,-·)
nextafter(min_subnormal,-·)
DBL_MIN ¤3.0
exp(-708.5)
ñÀºÅÙ¡§
(float)DBL_MIN
nextafterf
(FLT_MIN, -·)
expf(-87.4)
ÈóÀµµ¬¿ô¤Þ¤¿¤Ï 0
ÉÔÀµ³Î ´Ý¤á¤é¤ì¤¿Í­¸ú¤Ê±é»»·ë²Ì¤¬¡¢¿¿¤Î±é»»·ë²Ì¤È°Û¤Ê¤ë
(¤Û¤È¤ó¤É¤ÎÉâÆ°¾®¿ôÅÀ±é»»¤Ç¤Ï¤³¤ÎÎã³°¤¬È¯À¸¤¹¤ë)
2.0/3.0
(float)1.12345678
log(1.1)
DBL_MAX + DBL_MAX,
¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬¥È¥é¥Ã¥×¤µ¤ì¤Ê¤¤¤È¤­
±é»»·ë²Ì
(´Ý¤á¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¤Þ¤¿¤Ï¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Ê¤É)


ɽ 4-1 ¤ÎÃí

  1. Èó½ç½øÉÕ¤±Èæ³Ó:
    Ǥ°Õ¤ÎÉâÆ°¾®¿ôÃͤÎÁȤϡ¢·Á¼°¤¬°Û¤Ê¤Ã¤Æ¤¤¤Æ¤âÈæ³Ó¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¼¡¤Î 4 ¤Ä¤ÎÁê¸ß¤ËÇÓ¾Ū¤ÊÈæ³Ó±é»» (¤è¤ê¾®¤µ¤¤¡¢¤è¤êÂ礭¤¤¡¢Åù¤·¤¤¡¢¤ª¤è¤ÓÈó½ç½øÉÕ¤±) ¤¬²Äǽ¤Ç¤¹¡£Èó½ç½øÉÕ¤±¤È¤Ï¡¢¥ª¥Ú¥é¥ó¥É¤Î¤¦¤Á¾¯¤Ê¤¯¤È¤â 1 ¤Ä¤¬ NaN (Èó¿ô) ¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£

    ¤½¤ì¤¾¤ì¤Î NaN ¤Ï¡¢¤½¤Î NaN ¼«ÂΤâ´Þ¤á¤Æ¤¹¤Ù¤Æ¤ÎÃͤËÂФ·¤ÆÈó½ç½øÉÕ¤±¤ÇÈæ³Ó¤·¤Þ¤¹¡£¼¡¤Îɽ¤ÏÈó½ç½øÉÕ¤±´Ø·¸¤Î¤È¤­¡¢¤É¤Î±é»»»Ò¤¬Ìµ¸ú¤Ê±é»»Îã³°¤òȯÀ¸¤¹¤ë¤«¤ò¼¨¤·¤¿¤â¤Î¤Ç¤¹¡£

ɽ 4-2   Èó½ç½øÉÕ¤±Èæ³Ó
±é»»»Ò ̵¸ú¤ÊÎã³° (Èó½ç½øÉÕ¤±¤Î¾ì¹ç)
¿ô³Ø C, C++ F77
= == .EQ. ̵¸ú
¡â != .NE. ̵¸ú
> > .GT. ̵¸ú¤Ç¤Ï¤Ê¤¤
¡æ >= .GE. ̵¸ú¤Ç¤Ï¤Ê¤¤
< < .LT. ̵¸ú¤Ç¤Ï¤Ê¤¤
¡å <= .LE. ̵¸ú¤Ç¤Ï¤Ê¤¤


  1. ̵¸ú¤ÊÊÑ´¹:
    NaN¡¢¤Þ¤¿¤Ï̵¸ÂÂ礫¤éÀ°¿ô¤ËÊÑ´¹¤·¤è¤¦¤È¤¹¤ë¤³¤È¡£¤Þ¤¿¤ÏÉâÆ°¾®¿ôÅÀ·Á¼°¤«¤é¤ÎÊÑ´¹»þ¤ËȯÀ¸¤·¤¿À°¿ôÃÍ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡£

  2. IEEE ¤ÎñÀºÅÙ¡¢ÇÜÀºÅÙ¡¢¤ª¤è¤Ó³ÈÄ¥ÇÜÀºÅ٤ηÁ¼°¤Çɽ¸½²Äǽ¤ÊºÇ¾®¤ÎÀµµ¬¿ô¤Ï¡¢¤½¤ì¤¾¤ì 2-126¡¢2-1022¡¢2-16382 ¤Ç¤¹¡£IEEE ¤ÎÉâÆ°¾®¿ôÅÀ·Á¼°¤Ë¤Ä¤¤¤Æ¤Ï¡¢Âè 2 ¾Ï¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

x86 ÉâÆ°¾®¿ôÅÀ´Ä¶­¤Ë¤Ï¡¢IEEE µ¬³Ê¤Ë¤Ï¤Ê¤¤Îã³° (»Ø¿ô¤¬ºÇ¾®¤ÎÈóÀµµ¬¿ô¥ª¥Ú¥é¥ó¥ÉÎã³°) ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÎã³°¤Ï¡¢ÉâÆ°¾®¿ôÅÀ±é»»¤¬ÈóÀµµ¬¿ô¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤¿¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£

Îã³°¤ÎÍ¥Àè½ç°Ì¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£

ɽ 4-3   Îã³°¤ÎÍ¥Àè½ç°Ì  
x86 SPARC ¤ª¤è¤Ó PowerPC
̵¸ú ̵¸ú
¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼
½ü»» ½ü»»
¥¢¥ó¥À¡¼¥Õ¥í¡¼ ¥¢¥ó¥À¡¼¥Õ¥í¡¼
ÉÔÀµ³Î ÉÔÀµ³Î
ÈóÀµµ¬¿ô


Ʊ»þ¤ËȯÀ¸¤¹¤ë²ÄǽÀ­¤Î¤¢¤ëɸ½àŪ¤ÊÎã³°¤Ï¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ÈÉÔÀµ³Î¡¢¤ª¤è¤Ó¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ÈÉÔÀµ³Î¤À¤±¤Ç¤¹¡£x86 ¤Ç¤Ï¡¢5 ¤Ä¤Îɸ½àŪ¤ÊÎã³°¤Î¤É¤ì¤È¤Ç¤âƱ»þ¤ËÈóÀµµ¬¿ôÎã³°¤¬È¯À¸¤·¤Þ¤¹¡£¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¤ª¤è¤ÓÉÔÀµ³Î¤Î¥È¥é¥Ã¥×¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤È¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Î¥È¥é¥Ã¥×¤¬ÉÔÀµ³Î¥È¥é¥Ã¥×¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£¤³¤ì¤é¤Ï¤¹¤Ù¤Æ x86 ¤ÎÈóÀµµ¬¿ô¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£

Îã³°¤Î¸¡½Ð

IEEE µ¬³Ê¤ÇÍ׵ᤵ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢SPARC¡¢x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ÎÉâÆ°¾®¿ôÅÀ´Ä¶­¤Ç¤Ï¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤ÎȯÀ¸¤òµ­Ï¿¤¹¤ë¾õÂ֥ե饰¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤É¤ÎÎã³°¤¬È¯À¸¤·¤¿¤«¤ò¸¡½Ð¤¹¤ë¤¿¤á¤Ë¡¢¥×¥í¥°¥é¥à¤Ç¤³¤ì¤é¤Î¥Õ¥é¥°¤ò¥Æ¥¹¥È¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥é¥°¤Ï¡¢ÌÀ¼¨Åª¤ËÀßÄê¤Þ¤¿¤Ï¥¯¥ê¥¢¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ieee_flags ´Ø¿ô¤Ï¤³¤ì¤é¤ÎÎã³°¤Ë¥¢¥¯¥»¥¹¤¹¤ëÊýË¡¤Î 1 ¤Ä¤Ç¤¹¡£C ¤ª¤è¤Ó C++ ¤Ç½ñ¤­¹þ¤Þ¤ì¤¿¥×¥í¥°¥é¥à¤Ç¤Ï¡¢libm9x.so ¤Ë´Þ¤Þ¤ì¤ë C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤Ë¤è¤êÊ̤ξõÂ֥ե饰¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

SPARC ¤Ç¤Ï¡¢³ÆÎã³°¤Ë¸½¾õ¤ò¼¨¤¹¡Ö¸½ºß¥Õ¥é¥°¡×¤È¡ÖÎßÀѥե饰¡×¤Î 2 ¤Ä¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¸½ºß¤ÎÎã³°¥Õ¥é¥°¤Ï¡¢ºÇ¸å¤Ë¼Â¹Ô¤µ¤ì¤¿ÉâÆ°¾®¿ôÅÀ¤Î±é»»·ë²Ì¤Ë¤è¤Ã¤Æ¤½¤ÎÅÔÅÙ¹¹¿·¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¸½ºß¤ÎÎã³°¥Õ¥é¥°¤ÏÎßÀÑÎã³°¥Õ¥é¥°¤Ë¤âÎßÀѤµ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤Ã¤Æ¡¢¥×¥í¥°¥é¥à¤Î¼Â¹Ô³«»Ï¸å¤Þ¤¿¤Ï¥×¥í¥°¥é¥à¤Ë¤è¤êÎßÀѥե饰¤¬ºÇ¸å¤Ë¥¯¥ê¥¢¤µ¤ì¤¿»þÅÀ°Ê¹ß¤ËȯÀ¸¤·¡¢¤Þ¤À¥È¥é¥Ã¥×¤µ¤ì¤Æ¤¤¤Ê¤¤¤¹¤Ù¤Æ¤ÎÎã³°¤¬µ­Ï¿¤µ¤ì¤Þ¤¹¡£ÉâÆ°¾®¿ôÅÀ±é»»¤¬¥È¥é¥Ã¥×¤µ¤ì¤¿Îã³°¤Î¸¶°ø¤Ç¤¢¤ë¾ì¹ç¡¢¤½¤Î¥È¥é¥Ã¥×¤òȯÀ¸¤µ¤»¤¿Îã³°¤ËÂбþ¤¹¤ë¸½ºß¤ÎÎã³°¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤Þ¤¹¤¬¡¢ÎßÀѥե饰¤ÏÊѹ¹¤µ¤ì¤Þ¤»¤ó¡£¸½ºß¤ÎÎã³°¥Õ¥é¥°¤ÈÎßÀÑÎã³°¥Õ¥é¥°¤Ï¡¢ÉâÆ°¾®¿ôÅÀ¾õÂ֥쥸¥¹¥¿ %fsr Æâ¤ËÊݸ¤µ¤ì¤Þ¤¹¡£

x86 ¤Ç¤Ï¡¢ÎßÀѥե饰¤Ï¡¢ºÇ½é¤ÎÎ㳰ȯÀ¸»þ¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ÌÀ¼¨Åª¤Ë¥¯¥ê¥¢¤·¤Ê¤¤¸Â¤ê¡¢¥æ¡¼¥¶¡¼¥×¥í¥»¥¹¤Î½ªÎ»¤Þ¤Ç¤½¤ÎÃͤòÊÝ»ý¤·¤Þ¤¹¡£

ieee_flags(3m)

ieee_flags(3m) ¸Æ¤Ó½Ð¤·¤Î¹½Ê¸¤Ï¼¡¤ÎÄ̤ê¤Ç¤¹¡£

i = ieee_flags (action, mode, in, out);

2 ¤ÄÌܤΰú¿ô¤Ë exception ¤È¤¤¤¦Ê¸»úÎó¤ò»ØÄꤹ¤ë¤È¡¢¥×¥í¥°¥é¥à¤Ï ieee_flags(3m) ´Ø¿ô¤ò»ÈÍѤ·¤Æ¡¢È¯À¸¤·¤¿Îã³°¤Î¥¹¥Æ¡¼¥¿¥¹¥Õ¥é¥°¤ò¡¢¸¡ºº¡¢ÀßÄê¡¢¥¯¥ê¥¢¤·¤Þ¤¹¡£

¤¿¤È¤¨¤Ð¡¢FORTRAN ¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼Îã³°¥Õ¥é¥°¤ò¥¯¥ê¥¢¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£

      character*8 out
      call ieee_flags('clear', 'exception', 'overflow', out)

C ¤Þ¤¿¤Ï C++ ¤Ç¤Ï¡¢Îã³°¤¬È¯À¸¤·¤¿¤«¤É¤¦¤«¤ÎÌ䤤¹ç¤ï¤»¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£

      i = ieee_flags("get", "exception", in, out);

½èÍý¤¬ÆÃÄê¤Ç¤­¤¿¾ì¹ç¤Ë½ÐÎϥѥé¥á¡¼¥¿ out ¤ËÊÖ¤µ¤ì¤ëʸ»úÎó¤Ï¡¢°Ê²¼¤ÎÄ̤ê¤Ç¤¹¡£

FORTRAN ¸Æ¤Ó½Ð¤·¤Ë¤ª¤±¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£

      character*8 out
      i = ieee_flags ('get', 'exception', 'division', out)

¥¼¥í¤Ë¤è¤ë½ü»»¤ÎÎã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢out ¤Ï "division" ¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ºÇ¤âÍ¥Àè½ç°Ì¤Î¹â¤¤Îã³°¤¬ out ¤ËÊÖ¤µ¤ì¤Þ¤¹¡£in ¤ËÆÃÄê¤ÎÎã³°¤¬»ØÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤½¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£

¤¿¤È¤¨¤Ð¡¢¼¡¤Î¸Æ¤Ó½Ð¤·¤Ç¤Ï "all" ¤Ë¤ÏÆÃÊ̤ʰÕÌ£¤Ï¤¢¤ê¤Þ¤»¤ó¡£

      i = ieee_flags("get", "exception", "all", out);

¤µ¤é¤Ë ieee_flags ¤Ï¡¢¸½ºßȯÀ¸¤·¤Æ¤¤¤ëÎã³°¥Õ¥é¥°¤ò¤¹¤Ù¤ÆÁȤ߹ç¤ï¤»¤¿À°¿ôÃͤâÊÖ¤·¤Þ¤¹¡£¤³¤ÎÃͤϡ¢¤¹¤Ù¤Æ¤ÎÎã³°¥Õ¥é¥°¤Î¥Ó¥Ã¥Èñ°Ì¤ÎÏÀÍýϤǡ¢¤½¤ì¤¾¤ì¤Î¥Õ¥é¥°¤Ïɽ 4-4 ¤Ë¼¨¤¹¤è¤¦¤Ë¥Ó¥Ã¥È¤Çɽ¤ï¤·¤Þ¤¹¡£sys/ieeefp.h ¥Õ¥¡¥¤¥ë¤Ï¡¢¤½¤ì¤¾¤ì¤ÎÎã³°¤ËÂбþ¤¹¤ë¥Ó¥Ã¥È°ÌÃÖ¤òÄêµÁ¤·¤Þ¤¹¡£¤³¤Î¥Ó¥Ã¥È°ÌÃ֤ϥޥ·¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¡¢Ï¢Â³ (ÎÙÀÜ) ¤·¤Æ¤¤¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£

ɽ 4-4   Îã³°¥Ó¥Ã¥È
Îã³° ¥Ó¥Ã¥È°ÌÃÖ Îã³°¥Ó¥Ã¥È
̵¸ú fp_invalid i & (1 << fp_invalid)
¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ fp_overflow i & (1 << fp_overflow)
½ü»» fp_division i & (1 << fp_division)
¥¢¥ó¥À¡¼¥Õ¥í¡¼ fp_underflow i & (1 << fp_underflow)
ÉÔÀµ³Î fp_inexact i & (1 << fp_inexact)
ÈóÀµµ¬¿ô fp_denormalized i & (1 << fp_denormalized)
(x86 ¤Î¤ß)


²¼µ­¤Î C ¤Þ¤¿¤Ï C++ ¤Î¥×¥í¥°¥é¥à¤Î°ìÉô¤Ï¡¢i ¤ÎÃͤò¥Ç¥³¡¼¥É¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£

/*
 *	¤¹¤Ù¤Æ¤ÎÎßÀÑÎã³°¤ò¼¨¤¹À°¿ôÃͤò¥Ç¥³¡¼¥É¤·¤Þ¤¹¡£
 *	fp_inexact ¤Ê¤É¤Ï¡¢<sys/ieeefp.h> Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
 */

 
char *out;
int invalid, division, overflow, underflow, inexact;
code = ieee_flags("get", "exception", "", &out);
printf ("out is %s, code is %d, in hex: 0x%08X\n",
         out, code, code);
inexact	=	(code >> fp_inexact)	& 0x1; 
division	=	(code >> fp_division)	& 0x1; 
underflow	=	(code >> fp_underflow)	& 0x1; 
overflow	=	(code >> fp_overflow)	& 0x1; 
invalid	=	(code >> fp_invalid)	& 0x1; 
printf("%d %d %d %d %d \n", invalid, division, overflow,
		underflow, inexact); 

C99 Îã³°¥Õ¥é¥°´Ø¿ô

C ¤ª¤è¤Ó C++ ¥×¥í¥°¥é¥à¤Ç¤Ï¡¢libm9x.so ¤Ë´Þ¤Þ¤ì¤ë C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤ò»ÈÍѤ·¤Æ¡¢ÉâÆ°¾®¿ôÅÀ¤ÎÎã³°¥Õ¥é¥°¤Î¥Æ¥¹¥È¡¢¥»¥Ã¥È¡¢¤ª¤è¤Ó¥¯¥ê¥¢¤¬¤Ç¤­¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¥Õ¥¡¥¤¥ë fenv.h ¤Ï¡¢5 ¤Ä¤Îɸ½àŪ¤ÊÎã³°¡¢FE_INEXACT¡¢FE_UNDERFLOW¡¢FE_OVERFLOW¡¢FE_DIVBYZERO¡¢¤ª¤è¤Ó FE_INVALID ¤ËÂбþ¤¹¤ë 5 ¤Ä¤Î¥Þ¥¯¥í¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£fenv.h ¤Ï¡¢¥Þ¥¯¥í FE_ALL_EXCEPT ¤¬ 5 ¤Ä¤ÎÎã³°¥Þ¥¯¥í¤¹¤Ù¤Æ¤Î¥Ó¥Ã¥Èñ°Ì¤ÎÏÀÍýϤȤʤë¤è¤¦¤Ë¤âÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤é¤Î¥Þ¥¯¥í¤òÁȤ߹ç¤ï¤»¤ë¤³¤È¤Ë¤è¤ê¡¢Îã³°¥Õ¥é¥°¤ÎǤ°Õ¤Î¥µ¥Ö¥»¥Ã¥È¤Î¥Æ¥¹¥È¤ä¥¯¥ê¥¢¤ò¹Ô¤Ã¤¿¤ê¡¢Îã³°¤ÎǤ°Õ¤ÎÁȤ߹ç¤ï¤»¤òȯÀ¸¤µ¤»¤¿¤ê¤Ç¤­¤Þ¤¹¡£¼¡¤Ë¡¢¤³¤ì¤é¤Î¥Þ¥¯¥í¤ò C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤Î¤¤¤¯¤Ä¤«¤È¤¢¤ï¤»¤Æ»ÈÍѤ·¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢feclearexcept(3M) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£°ì´Ó¤·¤¿Æ°ºî¤òÊݤĤ¿¤á¡¢libm9x.so ¤Ë´Þ¤Þ¤ì¤ë C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤È³ÈÄ¥µ¡Ç½¡¢¤ª¤è¤Ó libsunmath ¤Ë´Þ¤Þ¤ì¤ë ieee_flags ¤È ieee_handler ´Ø¿ô¤ÎξÊý¤òƱ¤¸¥×¥í¥°¥é¥àÆâ¤Ç»ÈÍѤ¹¤ë¤³¤È¤ÏÈò¤±¤Æ¤¯¤À¤µ¤¤¡£

5 ¤Ä¤ÎÎã³°¥Õ¥é¥°¤¹¤Ù¤Æ¤ò¥¯¥ê¥¢¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£

feclearexcept(FE_ALL_EXCEPT);

̵¸Â±é»»¤Þ¤¿¤Ï¥¼¥í½ü»»¤¬È¯À¸¤·¤¿¤«¤É¤¦¤«¤ò¥Æ¥¹¥È¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£

int i;

 
i = fetestexcept(FE_IMVALID | FE_DIVBYZERO);
if (i& FE_INVALID)
/* ̵¸ú¤ÊÎã³°¤¬È¯À¸¤·¤Þ¤·¤¿ */
else if (i & FE_DIVBYZERO)
/* ¥¼¥í½ü»»Îã³°¤¬È¯À¸¤·¤Þ¤·¤¿ */

¥ª¡¼¥Ð¡¼¥Õ¥í¡¼Îã³°¤ÎȯÀ¸¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹ (¤³¤Î¥³¡¼¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¥È¥é¥Ã¥×¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¤Ï¥È¥é¥Ã¥×¤òµ¯¤³¤¹¤³¤È¤ËÃí°Õ)¡£

feraiseexcept(FE_OVERFLOW);

fegetexceptflag ¤ª¤è¤Ó fesetexceptflag ´Ø¿ô¤Ï¡¢¥Õ¥é¥°¤Î¥µ¥Ö¥»¥Ã¥È¤ÎÊݸ¤ÈÉü¸µ¤Ë»ÈÍѤ·¤Þ¤¹¡£¼¡¤Ë¡¢¤³¤Î 2 ¤Ä¤Î´Ø¿ô¤ò»ÈÍѤ·¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£

fexcept_t flags;

 
/* ¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¤ª¤è¤ÓÉÔÀµ³Î¤Î¥Õ¥é¥°¤òÊݸ¤·¤Þ¤¹ */
fegetexceptflag(&flags, FE_UNDERFLOW | FE_OVERFLOW | FE_INEXACT);
/* ¤³¤ì¤é¤Î¥Õ¥é¥°¤ò¥¯¥ê¥¢¤·¤Þ¤¹ */
feclearexcept(FE_UNDERFLOW | FE_OVERFLOW | FE_INEXACT);
/* ¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Î²ÄǽÀ­¤Î¤¢¤ë±é»»¤ò¹Ô¤¤¤Þ¤¹ */
...
/* ¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òÄ´¤Ù¤Þ¤¹ */
if (fetestexcept(FE_UNDERFLOW | FE_OVERFLOW) != 0) {
...
}
/* ¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¤ª¤è¤ÓÉÔÀµ³Î¤Î¥Õ¥é¥°¤òÉü¸µ¤·¤Þ¤¹ */
fesetexceptflag(&flags, FE_UNDERFLOW | FE_OVERFLOW, | FE_INEXACT);

Îã³°¤ÎÆÃÄê

¥×¥í¥°¥é¥Þ¤¬Îã³°¤ò¹Íθ¤·¤Æ¥×¥í¥°¥é¥à¤òºîÀ®¤·¤Æ¤¤¤Ê¤¤¤¿¤á¤Ë¡¢Îã³°¤¬¸¡½Ð¤µ¤ì¤¿¤È¤­¤Ë¡¢¤É¤³¤ÇÎã³°¤¬È¯À¸¤·¤¿¤Î¤«¤¬ÌäÂê¤Ë¤Ê¤ë¤³¤È¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£Îã³°¤¬È¯À¸¤·¤¿¾ì½ê¤òÆÃÄꤹ¤ëÊýË¡¤Î 1 ¤Ä¤Ï¡¢¥×¥í¥°¥é¥àÃæ¤Î¤µ¤Þ¤¶¤Þ¤Ê²Õ½ê¤ÇÎã³°¥Õ¥é¥°¤ò¥Æ¥¹¥È¤¹¤ë¤³¤È¤Ç¤¹¤¬¡¢¤³¤ÎÊýË¡¤ÇÀµ³Î¤ËÎã³°¤òÆÃÄꤹ¤ë¤Ë¤Ï¡¢Â¿¤¯¤Î¥Æ¥¹¥È¤ÈÏ«ÎϤ¬É¬Íפˤʤê¤Þ¤¹¡£

Îã³°¤ÎȯÀ¸¤·¤¿¾ì½ê¤òÆÃÄꤹ¤ë´Êñ¤ÊÊýË¡¤Ï¡¢Îã³°¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤Ç¤¹¡£¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¡¢¤¢¤ëÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ï¡¢SIGFPE ¥·¥°¥Ê¥ë¤òÁ÷¤Ã¤Æ¥×¥í¥°¥é¥à¤ËÄÌÃΤ·¤Þ¤¹ (¾ÜºÙ¤Ï¡¢signal(5) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£Îã³°¤Î¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢¥Ç¥Ð¥Ã¥¬¤Ç¼Â¹Ô¤·¤Æ SIGFPE ¥·¥°¥Ê¥ë¤ò¼õ¿®¤·¤¿»þÅÀ¤Ç¥×¥í¥°¥é¥à½ªÎ»¤¹¤ë¤«¡¢¤Þ¤¿¤ÏÎã³°¤¬È¯À¸¤·¤¿Ì¿Îá¤Î¥¢¥É¥ì¥¹¤ò½ÐÎϤ¹¤ë¤è¤¦¤Ë SIGFPE ¥Ï¥ó¥É¥é¤òÀßÄꤷ¤Æ¡¢Îã³°¤ÎȯÀ¸²Õ½ê¤òÆÃÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£SIGFPE ¥·¥°¥Ê¥ë¤òÀ¸À®¤¹¤ëÎã³°¤Ë¤Ä¤¤¤Æ¤Ï¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¥È¥é¥Ã¥×¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤ËÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢Âбþ¤¹¤ë¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¡¢¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤Ï ɽ 4-1 ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤Ç·Ñ³¤µ¤ì¤Æ¤Þ¤¹¤¬¡¢¥·¥°¥Ê¥ë¤ÏÁ÷¤é¤ì¤Þ¤»¤ó¡£

¥Ç¥Ð¥Ã¥¬¤ò»ÈÍѤ·¤ÆÎã³°¤òÆÃÄꤹ¤ë

¤³¤ÎÀá¤Ç¤Ï¡¢dbx (¥½¡¼¥¹¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥¬) ¤È adb (¥¢¥»¥ó¥Ö¥ê¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥¬) ¤Î»ÈÍÑÎã¤ò»²¹Í¤Ë¤·¤Æ¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤Î¸¶°ø¤È¡¢Î㳰ȯÀ¸¤µ¤»¤¿Ì¿Îá¤òÄ´¤Ù¤Þ¤¹¡£dbx ¤Ç¥½¡¼¥¹¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤ò -g ¥ª¥×¥·¥ç¥óÉÕ¤­¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¡Ødbx ¥³¥Þ¥ó¥É¤Ë¤è¤ë¥Ç¥Ð¥Ã¥°¡Ù¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¼¡¤Î¥×¥í¥°¥é¥à¤ò¸«¤Æ¤ß¤Þ¤¹¡£

      program ex
      double precision x,y sqrtm1
      x = -4.2d0 
      y = sqrtm1(x) 
      print * , x, y 
      end 

 
      double precision function sqrtm1(x) 
      double precision x 
      routine = sqrt(x) - 1.0d0 
      return 
      end 

¤³¤Î¥×¥í¥°¥é¥à¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¼Â¹Ô¤¹¤ë¤È¡¢¼¡¤Î¤è¤¦¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£

   -4.2000000000000 NaN                   
Note: IEEE floating-point exception flags raised: 
   Inexact; Invalid Operation; 
See the Numerical Computation Guide, ieee_flags(3M)  

 
[ÆüËܸìÌõ]
Ãí: °Ê²¼¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤¬È¯À¸¤·¤Þ¤·¤¿:
	ÉÔÀµ³Î¡¢Ìµ¸ú¤Ê±é»»
¾ÜºÙ¤Ï¡¢¡Ø¿ôÃÍ·×»»¥¬¥¤¥É¡Ù¤Î ieee_flags(3M) ¤Ë´Ø¤¹¤ëÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ
¤¤¡£

̵¸ú¤Ê±é»»¤Î¸¶°ø¤òÆͤ­»ß¤á¤ë¤Ë¤Ï¡¢Ìµ¸ú¤Ê±é»»¤Ë¤Ä¤¤¤Æ¤Î¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤¿¤á¤Ë¡¢-ftrap ¥ª¥×¥·¥ç¥ó¤òÉÕ¤±¤ÆºÆ¥³¥ó¥Ñ¥¤¥ë¤·¡¢dbx ¤Þ¤¿¤Ï adb ¤ò»ÈÍѤ·¤Æ SIGFPE ¥·¥°¥Ê¥ë¤¬Á÷¿®¤µ¤ì¤¿¾ì½ê¤òÆÃÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤â¤¦ 1 ¤Ä¤ÎÊýË¡¤È¤·¤Æ¡¢Ìµ¸ú¤Ê±é»»¤ËÂФ¹¤ë¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ëµ¯Æ°¥ë¡¼¥Á¥ó¤È¥ê¥ó¥¯¤¹¤ë¤«¡¢¤Þ¤¿¤Ï¼êÆ°¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤»¤º¤Ë¡¢dbx ¤Þ¤¿¤Ï adb ¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

dbx ¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤È¤Ê¤Ã¤Æ¤¤¤ëÌ¿Îá¤òÆÃÄꤹ¤ë

ÉâÆ°¾®¿ôÅÀÎã³°¤Î¸¶°ø¤òÆͤ­»ß¤á¤ë¤Ë¤Ï¡¢-g ¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó -ftrap ¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤ÆºÆ¥³¥ó¥Ñ¥¤¥ë¤·¡¢dbx ¤ò»ÈÍѤ·¤ÆÎã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¾ì½ê¤òÄÉÀפ·¤Þ¤¹¡£

example% f77 -g -ftrap=invalid ex.f

-g ¥ª¥×¥·¥ç¥ó¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¡¢ dbx ¤Î¥½¡¼¥¹¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥°µ¡Ç½¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£-ftrap=invalid ¤ò»ØÄꤹ¤ë¤È¡¢Ìµ¸ú¤Ê±é»»¤ËÂФ¹¤ëÎã³°¤Î¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Æ¥×¥í¥°¥é¥à¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£

¼¡¤Ë¡¢dbx ¤òµ¯Æ°¤·¡¢SIGFPE ¤¬½Ð¤µ¤ì¤¿¤È¤­¤Ë¥×¥í¥°¥é¥à¤òÄä»ß¤¹¤ë¤è¤¦¤Ë
catch fpe ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£·ë²Ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

example% dbx a.out
Reading symbolic information for a.out
Reading symbolic information for rtld /usr/lib/ld.so.1
Reading symbolic information for libF77.so.3
Reading symbolic information for libsunmath.so.1
Reading symbolic information for libm.so.1
Reading symbolic information for libc.so.1
Reading symbolic information for libdl.so.1
(dbx) catch fpe
(dbx) run
Running: a.out
(process id 17516)
signal FPE (invalid floating point operation) in sqrtm1 at line 
10 in file "ex.f"
   10         sqrtm1 = sqrt(x) - 1.0d0
(dbx) print x
x = -4.2
(dbx)

¤³¤Î½ÐÎÏÎã¤Ç¤Ï¡¢Éé¤Î¿ô¤ÎÊ¿Êýº¬¤òµá¤á¤è¤¦¤È¤·¤¿·ë²Ì¡¢sqrtm1 ´Ø¿ô¤ÇÎã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

adb ¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤È¤Ê¤Ã¤Æ¤¤¤ëÌ¿Îá¤òÆÃÄꤹ¤ë

adb ¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤òÆÃÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢dbx ¤È¤Ï°Û¤Ê¤ê¡¢adb ¤Ç¤Ï¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ä¹ÔÈÖ¹æ¤ÏÆÃÄê¤Ç¤­¤Þ¤»¤ó¡£adb ¤ò»ÈÍѤ¹¤ë¾ì¹ç¤â¡¢ºÇ½é¤Î¼ê½ç¤Ï
-ftrap ¤ò»ØÄꤷ¤Æ¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£

 example% f77 -ftrap=invalid ex.f

¼¡¤Ë adb ¤òµ¯Æ°¤·¤Æ¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£Ìµ¸ú¤Ê±é»»Îã³°¤¬È¯À¸¤¹¤ë¤È¡¢adb ¤ÏÎã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤Î¼¡¤ÎÌ¿Îá¤ÇÄä»ß¤·¤Þ¤¹¡£Îã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎÌ¿Îá¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¡¢adb ¤¬Ää»ß¤·¤¿Ì¿Îá¤è¤êÁ°¤Ë¤¢¤ëºÇ¸å¤ÎÉâÆ°¾®¿ôÅÀÌ¿Îá¤òõ¤·¤Þ¤¹¡£SPARC ¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢·ë²Ì¤Ï¼¡¤ÎÎã¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

example% adb a.out
:r
SIGFPE 8: numerical exception (invalid floating point operation)
stopped at      routine_+0x20:  ldd     [%l0], %f2
routine_+10?5i
routine_+0x10:  ld      [%l0 + 0x4], %f3
                fsqrtd  %f2, %f4
                sethi   %hi(0x11c00), %l0
                or      %l0, 0x1d8, %l0
                ldd     [%l0], %f2
<f2=F
                -4.2000000000000002e+00

¤³¤Î½ÐÎÏÎã¤Ï¡¢fsqrtd Ì¿Î᤬¸¶°ø¤ÇÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£¥½¡¼¥¹¥ì¥¸¥¹¥¿¤òÄ´¤Ù¤ë¤È¡¢Éé¤Î¿ô¤ÎÊ¿Êýº¬¤òµá¤á¤è¤¦¤È¤·¤¿¤¿¤á¤Ë¤³¤ÎÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

x86 ¤Ç¤Ï¡¢Ì¿Î᤬¸ÇÄêĹ¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢¥³¡¼¥É¤ÎµÕ¥¢¥»¥ó¥Ö¥ë¤ò³«»Ï¤¹¤ëÀµ¤·¤¤¥¢¥É¥ì¥¹¤ò¸«¤Ä¤±¤ë¤Ë¤Ï»î¹Ôºø¸í¤¬É¬Íפˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢´Ø¿ô¤ÎÀèƬÉÕ¶á¤ÇÎã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤³¤«¤éµÕ¥¢¥»¥ó¥Ö¥ë¤Ç¤­¤Þ¤¹¡£°ìÈÌŪ¤Ê·ë²Ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

example% adb a.out
:r
SIGFPE: Arithmetic Exception (invalid floating point operation)
stopped at      sqrtm1_+0x13:  faddp  %st,%st(1)
sqrtm1_?8i
sqrtm1_:
sqrtm1_:        pushl  %ebp
                movl   %esp,%ebp
                subl   $0x24,%esp
                fldl   $0x8048b88
                movl   0x8(%ebp),%eax
                fldl   (%eax)
                fsqrt
                faddp  %st,%st(1)
$x
80387 chip is present.
cw      0x137e
sw      0x3000
cssel 0x17  ipoff 0x8acd               datasel 0x1f  dataoff 0x0

 
 st[0]  -4.2000000000000001776356839             VALID
 st[1]  -1.0                                     VALID
 st[2]  +0.0                                     EMPTY
 st[3]  +0.0                                     EMPTY
 st[4]  +0.0                                     EMPTY
 st[5]  +0.0                                     EMPTY
 st[6]  +0.0                                     EMPTY
 st[7]  +0.0                                     EMPTY

¤³¤Î½ÐÎÏÎã¤Ï¡¢fsqrt Ì¿Î᤬¸¶°ø¤ÇÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤òÄ´¤Ù¤ë¤È¡¢Éé¤Î¿ô¤ÎÊ¿Êýº¬¤òµá¤á¤è¤¦¤È¤·¤¿¤¿¤á¤Ë¤³¤ÎÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

ºÆ¥³¥ó¥Ñ¥¤¥ë¤»¤º¤Ë¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë

¾åµ­¤ÎÎã¤Ç¤Ï¡¢-ftrap ¥Õ¥é¥°¤ò»ØÄꤷ¤Æ¡¢¼ç¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢Ìµ¸ú¤Ê±é»»¤ÎÎã³°¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Þ¤·¤¿¡£¼ç¥×¥í¥°¥é¥à¤ÎºÆ¥³¥ó¥Ñ¥¤¥ë¤¬ÉÔ²Äǽ¤Ê¾ì¹ç¤¬¤¢¤ê¡¢Â¾¤ÎÊýË¡¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¤¤¤¯¤Ä¤«¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£

dbx ¤Î»ÈÍÑÃæ¤Ë¡¢ÉâÆ°¾®¿ôÅÀ¾õÂ֥쥸¥¹¥¿¤òľÀÜÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£SPARC ¤Ç¤Ï¡¢¤³¤ÎÊýË¡¤Ë¤ÏÃí°Õ¤¬É¬ÍפǤ¹¡£¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¥×¥í¥°¥é¥àÆâ¤ÇºÇ½é¤Ë»ÈÍѤµ¤ì¤ë¤Þ¤ÇÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤Ï»ÈÍѲÄǽ¤Ë¤Ê¤ê¤Þ¤»¤ó¡£ÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤¬ºÇ½é¤Ë»ÈÍѤµ¤ì¤¿»þÅÀ¤Ç¡¢ÉâÆ°¾®¿ôÅÀ¾õÂ֥쥸¥¹¥¿¤Ï¥ê¥»¥Ã¥È¤µ¤ì¡¢¤¹¤Ù¤Æ¤Î¥È¥é¥Ã¥×¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥×¥í¥°¥é¥à¤¬¾¯¤Ê¤¯¤È¤â 1 ¤Ä¤ÎÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò¼Â¹Ô¤¹¤ë¤Þ¤Ç¤Ï¼êÆ°¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£

¤³¤³¤Ç¼¨¤·¤¿Îã¤Ç¤Ï¡¢sqrtm1 ´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤Þ¤Ç¤ËÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤Ï¥¢¥¯¥»¥¹¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤Î´Ø¿ô¤Ø¤ÎÆþ¸ý¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¡¢Ìµ¸ú¤Ê±é»»¤ËÂФ¹¤ëÎã³°¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¡¢SIGFPE ¥·¥°¥Ê¥ë¤Î¼õ¿®»þ¤Ë dbx ¤òÄä»ß¤¹¤ë¤è¤¦ÀßÄꤷ¤Æ¡¢¼Â¹Ô¤ò·Ñ³¤Ç¤­¤Þ¤¹¡£¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥·¥¹¥Æ¥à¤Ç¤Î¼ê½ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£Ìµ¸ú¤Ê±é»»Îã³°¤ËÂФ¹¤ë¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤¿¤á¤Ë¡¢assign ¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ %fsr ¤òÊѹ¹¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£

example% dbx a.out
Reading symbolic information for a.out
Reading symbolic information for rtld /usr/lib/ld.so.1
Reading symbolic information for libF77.so.3
Reading symbolic information for libsunmath.so.1
Reading symbolic information for libm.so.1
Reading symbolic information for libc.so.1
Reading symbolic information for libdl.so.1
(dbx) stop in sqrtm1_
dbx: warning: 'sqrtm1_' has no debugger info -- will trigger on
first instruction
(2) stop in sqrtm1_
(dbx) run
Running: a.out
(process id 6631)
stopped in sqrtm1_ at 0x10c00
0x00010c00: sqrtm1_       :    save    %sp, -0x68, %sp
(dbx) assign $fsr=0x08000000
dbx: warning: unknown language, 'fortran' assumed
(dbx) catch fpe
(dbx) cont
signal FPE (invalid floating point operation) in sqrtm1_ at 
0x10c20
0x00010c20: sqrtm1_+0x0020:    ldd     [%l0], %f2
(dbx)

x86 ¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤¬³Æ¥×¥í¥°¥é¥àÆâ¤Ë¼«Æ°Åª¤Ë¥ê¥ó¥¯¤¹¤ëµ¯Æ°¥³¡¼¥É¤Ï¡¢À©¸æ¤ò¥á¥¤¥ó¥×¥í¥°¥é¥à¤Ë°ú¤­ÅϤ¹Á°¤ËÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤ò½é´ü²½¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¥á¥¤¥ó¥×¥í¥°¥é¥à¤¬³«»Ï¤·¤¿¸å¤Ç¡¢¤¤¤Ä¤Ç¤â¼êÆ°¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤Ç¤­¤Þ¤¹¡£¼¡¤Ë¡¢¤³¤Î½èÍý¤Î¥¹¥Æ¥Ã¥×Îã¤ò¼¨¤·¤Þ¤¹¡£

example% dbx a.out
Reading symbolic information for a.out
Reading symbolic information for rtld /usr/lib/ld.so.1
Reading symbolic information for libF77.so.3
Reading symbolic information for libsunmath.so.1
Reading symbolic information for libm.so.1
Reading symbolic information for libc.so.1
Reading symbolic information for libdl.so.1
(dbx) stop in main
dbx: warning: 'main' has no debugger info -- will trigger on
first instruction
(2) stop in main
(dbx) run
Running: a.out
(process id 3285)
stopped in main at 0x8048b00
0x00010c00: main       :         push1  %ebp
(dbx) assign $fctrl=0x137e
(dbx) catch fpe
(dbx) cont
signal FPE (invalid floating point operation) in main at 
0x8048add
0x08048add: sqrtm1_+0x000d:    fadd     0x8048bac
(dbx)

¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë½é´ü²½¥ë¡¼¥Á¥ó¤òºîÀ®¤¹¤ë¤È¡¢¥á¥¤¥ó¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤¿¤ê dbx ¤ò»ÈÍѤ·¤¿¤ê¤¹¤ë¤³¤È¤Ê¤¯¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢Îã³°¤¬È¯À¸¤¹¤ë¾ì¹ç¤Ë¡¢¥Ç¥Ð¥Ã¥¬¾å¤Ç¼Â¹Ô¤¹¤ë¤³¤È¤Ê¤¯¥×¥í¥°¥é¥à¤òÃæ»ß¤·¤¿¤¤¾ì¹ç¤Ê¤É¤ËÊØÍø¤Ç¤¹¡£¤³¤Î¤è¤¦¤Ê¥ë¡¼¥Á¥ó¤òºîÀ®¤¹¤ëÊýË¡¤Ï 2 ¤Ä¤¢¤ê¤Þ¤¹¡£

¥×¥í¥°¥é¥à¤ò¹½À®¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤È¥é¥¤¥Ö¥é¥ê¤¬»ÈÍѲÄǽ¤Ê¾ì¹ç¡¢¥×¥í¥°¥é¥à¤òŬÀڤʽé´ü²½¥ë¡¼¥Á¥ó¤ËºÆ¥ê¥ó¥¯¤¹¤ë¤À¤±¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ºÇ½é¤Ë¡¢¼¡¤Î¤è¤¦¤Ê C ¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£

#include <ieeefp.h>

 
#pragma init (trapinvalid)

 
void trapinvalid()
{
     /* FP_X_INV ¤Ê¤É¤Ï ieeefp.h Æâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹*/
     fpsetmask(FP_X_INV);
}

¼¡¤Ë¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¸µ¤Î¥×¥í¥°¥é¥à¤ò¤³¤Î¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£

example% cc -c init.c
example% f77 ex.o init.o
example% a.out
Floating point exception 7, invalid operand, occurred at address
8048afd.
Abort

ºÆ¥ê¥ó¥¯¤¬ÉÔ²Äǽ¤Ç¤¢¤ë¤¬¥×¥í¥°¥é¥à¤ÏưŪ¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤È¤¤¤¦¾ì¹ç¤Ï¡¢¼Â¹Ô»þ¥ê¥ó¥«¡¼¤Î¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ò¥×¥ê¥í¡¼¥É¤¹¤ëµ¡Ç½¤ò»ÈÍѤ·¤Æ¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£SPARC ¥·¥¹¥Æ¥à¤Ç¤³¤Î¤è¤¦¤Ë¹Ô¤¦¾ì¹ç¤Ï¡¢¾åµ­¤ÈƱ¤¸ C ¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¼¡¤Ë¼¨¤¹ÊýË¡¤Ç¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¤¯¤À¤µ¤¤¡£

example% cc -Kpic -G -ztext init.c -o init.so -lc

¼¡¤Ë¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£init.so ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Ñ¥¹Ì¾¤ò¡¢´Ä¶­ÊÑ¿ô LD_PRELOAD ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥×¥ê¥í¡¼¥É¤¹¤ë¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Î°ìÍ÷¤ËÄɲä·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£

example% env LD_PRELOAD=./init.so a.out
Floating point exception 7, invalid operand, occurred at address 10c24.
Abort

¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®¤È¥×¥ê¥í¡¼¥É¤Î¾ÜºÙ¤Ï¡¢¡Ø¥ê¥ó¥«¡¼¤È¥é¥¤¥Ö¥é¥ê¡Ù¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¾åµ­¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢ÉâÆ°¾®¿ôÅÀ¤ÎÀ©¸æ¥â¡¼¥É¤Î½é´ü²½ÊýË¡¤Ï¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ò¥×¥ê¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤ê¸¶Â§¤È¤·¤ÆÊѹ¹¤Ç¤­¤Þ¤¹¡£¤·¤«¤·¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤Î½é´ü²½¥ë¡¼¥Á¥ó¤Ï¡¢¥×¥ê¥í¡¼¥É¤µ¤ì¤ë¾ì¹ç¤âÌÀ¼¨Åª¤Ë¥ê¥ó¥¯¤µ¤ì¤ë¾ì¹ç¤â¡¢¥á¥¤¥ó¤Î¼Â¹Ô¥×¥í¥°¥é¥à¤Î°ìÉô¤Ç¤¢¤ëµ¯Æ°¥³¡¼¥É¤ËÀ©¸æ¤òÅϤ¹Á°¤Ë¡¢¼Â¹Ô»þ¥ê¥ó¥«¡¼¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Â³¤¤¤Æµ¯Æ°¥³¡¼¥É¤Ï¡¢-ftrap¡¢-fround¡¢-fns (SPARC)¡¢¤Þ¤¿¤Ï -fprecision (x86) ¥³¥ó¥Ñ¥¤¥é¥Õ¥é¥°¤ò²ð¤·¤ÆÁªÂò¤µ¤ì¤ëÈó¥Ç¥Õ¥©¥ë¥È¥â¡¼¥É¤ò³ÎΩ¤·¤Þ¤¹¡£¤½¤·¤Æ¡¢¥á¥¤¥ó¤Î¼Â¹Ô¥×¥í¥°¥é¥à¤Î°ìÉô¤Ç¤¢¤ë½é´ü²½¥ë¡¼¥Á¥ó (ÀÅŪ¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤ò´Þ¤à) ¤ò¼Â¹Ô¤·¡¢ºÇ¸å¤ËÀ©¸æ¤ò¥á¥¤¥ó¥×¥í¥°¥é¥à¤ËÅϤ·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢SPARC ¤Ç¤Ï¡¢(i) ¾åµ­¤ÎÎã¤ÇÍ­¸ú¤Ë¤µ¤ì¤Æ¤¤¤ë¥È¥é¥Ã¥×¤Î¤è¤¦¤Ê¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤Î½é´ü²½¥ë¡¼¥Á¥ó¤Ë¤è¤ê³ÎΩ¤µ¤ì¤ëÉâÆ°¾®¿ôÅÀÀ©¸æ¥â¡¼¥É¤Ï¤¹¤Ù¤Æ¡¢Ìµ¸ú¤Ë¤µ¤ì¤Ê¤¤¤«¤®¤ê¥×¥í¥°¥é¥à¤Î¼Â¹ÔÃæ¤ÏÍ­¸ú¤Ê¾õÂÖ¤¬·Ñ³¤·¤Þ¤¹¡£(ii) ¥³¥ó¥Ñ¥¤¥é¥Õ¥é¥°¤ò²ð¤·¤ÆÁªÂò¤µ¤ì¤ëÈó¥Ç¥Õ¥©¥ë¥È¥â¡¼¥É¤Ï¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤Î½é´ü²½¥ë¡¼¥Á¥ó¤Ë¤è¤Ã¤Æ³ÎΩ¤µ¤ì¤ë¥â¡¼¥É¤ò̵¸ú¤Ë¤·¤Þ¤¹ (¤¿¤À¤·¡¢¥³¥ó¥Ñ¥¤¥é¥Õ¥é¥°¤ò²ð¤·¤ÆÁªÂò¤µ¤ì¤ë¥Ç¥Õ¥©¥ë¥È¥â¡¼¥É¤Ï¡¢°ÊÁ°¤Ë³ÎΩ¤µ¤ì¤Æ¤¤¤ë¥â¡¼¥É¤ò̵¸ú¤Ë¤·¤Þ¤»¤ó)¡£(iii) ¥á¥¤¥ó¤Î¼Â¹Ô¥×¥í¥°¥é¥à¤Î°ìÉô¤Ç¤¢¤ë½é´ü²½¥ë¡¼¥Á¥ó¤Þ¤¿¤Ï¡¢¥á¥¤¥ó¥×¥í¥°¥é¥à¼«ÂΤˤè¤Ã¤Æ³ÎΩ¤µ¤ì¤ë¥â¡¼¥É¤Ï¤¹¤Ù¤Æ¡¢Î¾Êý¤È¤â̵¸ú¤Ë¤·¤Þ¤¹¡£

x86 ¤Ç¤Ï¾õ¶·¤¬Ê£»¨¤Ç¤¹¡£¿·¤·¤¤¥×¥í¥»¥¹¤¬³«»Ï¤µ¤ì¤ë¤¿¤Ó¤Ë¥·¥¹¥Æ¥à¥«¡¼¥Í¥ë¤¬Èó¥Ç¥Õ¥©¥ë¥È¥â¡¼¥É¤ò¤¤¤¯¤Ä¤«»ÈÍѤ·¤ÆÉâÆ°¾®¿ôÅÀ¥Ï¡¼¥É¥¦¥§¥¢¤ò½é´ü²½¤·¤Þ¤¹¤¬¡¢¥á¥¤¥ó¥×¥í¥°¥é¥à¤ËÀ©¸æ¤òÅϤ¹Á°¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤ê¼«Æ°Ä󶡤µ¤ì¤ëµ¯Æ°¥³¡¼¥É¤¬¤½¤ì¤é¤Î¥â¡¼¥É¤Î°ìÉô¤ò¥Ç¥Õ¥©¥ë¥È¤Ë¥ê¥»¥Ã¥È¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤Î½é´ü²½¥ë¡¼¥Á¥ó¤Ï¡¢¤½¤ì¤é¤¬ÉâÆ°¾®¿ôÅÀÀ©¸æ¥â¡¼¥É¤òÊѹ¹¤·¤Ê¤¤¤«¤®¤ê¡¢Ìµ¸ú±é»»¡¢¥¼¥í½ü»»¡¢¤ª¤è¤Ó¥ª¡¼¥Ð¡¼¥Õ¥í¡¼Îã³°¤ËÂФ¹¤ë¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¡¢´Ý¤áÀºÅÙ¤ò 53 ¸Ä¤ÎÍ­¸ú¥Ó¥Ã¥È¤ËÀßÄꤷ¤¿¾õÂÖ¤ÇÆ°ºî¤·¤Þ¤¹¡£¼Â¹Ô»þ¥ê¥ó¥«¡¼¤¬À©¸æ¤òµ¯Æ°¥³¡¼¥É¤ËÅϤ·¤¿¸å¤Ï¡¢µ¯Æ°¥³¡¼¥É¤¬É¸½à C ¥é¥¤¥Ö¥é¥ê libc Æâ¤Î¥ë¡¼¥Á¥ó __fpstart ¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥È¥é¥Ã¥×¤¬¤¹¤Ù¤Æ̵¸ú¤Ë¤Ê¤ê¡¢´Ý¤áÀºÅÙ¤¬ 64 ¸Ä¤ÎÍ­¸ú¥Ó¥Ã¥È¤ËÀßÄꤵ¤ì¤Þ¤¹¡£µ¯Æ°¥³¡¼¥É¤Ï³¤¤¤Æ¡¢-fround¡¢-ftrap¡¢¤Þ¤¿¤Ï -fprecision ¥Õ¥é¥°¤Ë¤è¤êÁªÂò¤µ¤ì¤Æ¤¤¤ëÈó¥Ç¥Õ¥©¥ë¥È¥â¡¼¥É¤ò³ÎΩ¤·¡¢¤½¤Î¤¢¤ÈÀÅŪ¤Ë¥ê¥ó¥¯¤µ¤ì¤¿½é´ü²½¥ë¡¼¥Á¥ó¤ò¼Â¹Ô¤·¡¢À©¸æ¤ò¥á¥¤¥ó¥×¥í¥°¥é¥à¤ËÅϤ·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢½é´ü²½¥ë¡¼¥Á¥ó¤ò»ý¤Ä¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ò¥×¥ê¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤ê x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤¿¤ê´Ý¤áÀºÅ٥⡼¥É¤òÊѹ¹¤·¤¿¤ê¤¹¤ë¤Ë¤Ï¡¢¥È¥é¥Ã¥×¥¤¥Í¡¼¥Ö¥ë¥â¡¼¥É¤È´Ý¤áÀºÅ٥⡼¥É¤ò __fpstart ¥ë¡¼¥Á¥ó¤¬¥ê¥»¥Ã¥È¤·¤Ê¤¤¤è¤¦¤Ë¤³¤Î¥ë¡¼¥Á¥ó¤ò̵¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤·¤«¤·¡¢ÂåÂؤΠ__fpstart ¥ë¡¼¥Á¥ó¤Ï¡¢É¸½à¤Î¥ë¡¼¥Á¥ó¤¬¹Ô¤¦½é´ü²½µ¡Ç½¤Î»Ä¤ê¤ò¼Â¹Ô¤·¤Þ¤¹¡£¼¡¤Ë¡¢¤³¤Î½èÍý¤ò¹Ô¤¦¥³¡¼¥ÉÎã¤ò¼¨¤·¤Þ¤¹¡£

#include <ieeefp.h>
#include <sunmath.h>
#include <sys/sysi86.h>

#pragma init (trapinvalid)

void trapinvalid()
{
/* FP_X_INV et al ¤Ï ieeefp.h ¤ÇÄêµÁ¤µ¤ì¤Þ¤¹ */
fpsetmask(FP_X_INV);
}

extern int __fltrounds(), __flt_rounds;
extern long _fp_hw;

void __fpstart()
{

char *out;

/* System V ABI Intel ¥×¥í¥»¥Ã¥µ¥µ¥×¥ê¥á¥ó¥È¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë
ɸ½à¤Î __fpstart() ´Ø¿ô¤ÈƱ¤¸ÉâÆ°¾®¿ôÅÀ½é´ü²½¤ò¼Â¹Ô¤·¤Þ¤¹¤¬¡¢
¤¹¤Ù¤Æ¤Î¥È¥é¥Ã¥×¥â¡¼¥É¤ò¤½¤Î¤Þ¤Þ¤Ë¤·¤Þ¤¹ */
__flt_rounds = __fltrounds();
sysi86(SI86FPHW, &_fp_hw);
_fp_hw &= 0xff;
ieee_flags("set", "precision", "extended", &out);
}

¤³¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ò¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¥×¥ê¥í¡¼¥É¤¹¤ë¤È¡¢´üÂÔ¤µ¤ì¤ë·ë²Ì¤¬À¸À®¤µ¤ì¤Þ¤¹¡£

example% cc -Kpic -G -ztext init.c -o init.so -lc
example% env LD_PRELOAD=./init.so a.out
Floating point exception 7, invalid operand, occurred at address 8048afd.
Abort

¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤ò»ÈÍѤ·¤ÆÎã³°¤òÆÃÄꤹ¤ë

Á°¤ÎÀá¤Ç¤Ï¡¢Îã³°¤ÎºÇ½é¤ÎȯÀ¸¤òÆÃÄꤹ¤ë¤¿¤á¤Ë¥×¥í¥°¥é¥à¤Î³°¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ëÊýË¡¤ò¤¤¤¯¤Ä¤«¾Ò²ð¤·¤Þ¤·¤¿¡£¤³¤ì¤ËÂФ·¤Æ¡¢¥×¥í¥°¥é¥àÆâ¤Ç¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤ÆÎã³°¤ÎÆÃÄê¤ÎȯÀ¸¤ò¸¡½Ð¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Æ¤¤¤Æ¤â¡¢SIGFPE ¥Ï¥ó¥É¥é¤òÀßÄꤷ¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥È¥é¥Ã¥×¤µ¤ì¤¿Îã³°¤Î¼¡¤ÎȯÀ¸»þ¤Ë¥×¥í¥°¥é¥à¤¬°Û¾ï½ªÎ»¤·¤Þ¤¹¡£SIGFPE ¥Ï¥ó¥É¥é¤òÀßÄꤷ¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥È¥é¥Ã¥×¤µ¤ì¤¿Îã³°¤¬¼¡¤ËȯÀ¸¤¹¤ë¤È¡¢¥·¥¹¥Æ¥à¤ÏÀ©¸æ¤ò¥Ï¥ó¥É¥é¤ËÅϤ·¤Þ¤¹¡£¥Ï¥ó¥É¥é¤ÏÎã³°¤¬È¯À¸¤·¤¿Ì¿Îá¤Î¥¢¥É¥ì¥¹¤Ê¤É¤Î¿ÇÃǾðÊó¤ò½ÐÎϤ·¡¢°Û¾ï½ªÎ»¤¹¤ë¤«¡¢¼Â¹Ô¤òºÆ³«¤·¤Þ¤¹¡£¼Â¹Ô¤òºÆ³«¤·¤Æ°ÕÌ£¤Î¤¢¤ë·ë²Ì¤òÆÀ¤ë¤Ë¤Ï¡¢¼¡¤ÎÀá¤ÇÀâÌÀ¤¹¤ëÎã³°½èÍý¤Î¤¿¤á¤Î·ë²Ì¤ò¥Ï¥ó¥É¥é¤ÇÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

ieee_handler ¤ò»ÈÍѤ·¤Æ¡¢5 ¤Ä¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Î¤¹¤Ù¤Æ¤Î¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤ÈƱ»þ¤Ë¡¢»ØÄꤷ¤¿Îã³°¤¬È¯À¸¤·¤¿¤È¤­¤Ë¥×¥í¥°¥é¥à¤ò°Û¾ï½ªÎ»¤¹¤ë¤«¡¢SIGFPE ¥Ï¥ó¥É¥é¤òÀßÄꤹ¤ë¤è¤¦¤Ë»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£SIGFPE ¥Ï¥ó¥É¥é¤Ï¡¢Äã¥ì¥Ù¥ë¤Î´Ø¿ô sigfpe(3)¡¢singal(3c)¡¢sigaction(2) ¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤ÆÀßÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¤¬¡¢ieee_handler ¤È¤Ï°Û¤Ê¤ê¡¢¤³¤ì¤é¤Î´Ø¿ô¤Ç¤Ï¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤»¤ó¡£ÉâÆ°¾®¿ôÅÀÎã³°¤Ï¡¢¤½¤Î¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¤¢¤ë¾ì¹ç¤Î¤ß SIGFPE ¥·¥°¥Ê¥ë¤ò°ú¤­µ¯¤³¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

ieee_handler(3m)

ieee_handler ¤Î¸Æ¤Ó½Ð¤·»þ¤Î¹½Ê¸¤Ï¡¢¼¡¤ÎÄ̤ê¤Ç¤¹¡£

i ¡á ieee_handler (action, exception, handler)

2 ¤Ä¤ÎÆþÎϥѥé¥á¡¼¥¿ action (Æ°ºî) ¤È exception (Îã³°) ¤Ïʸ»úÎó¤Ç¤¹¡£3 ¤ÄÌܤΥѥé¥á¡¼¥¿ handler (¥Ï¥ó¥É¥é) ¤Ï¡¢·¿¤¬ sigfpe_handler_type ¤Î´Ø¿ô¤Ç¡¢
floatingpoint.h (FORTRAN ¤Î¾ì¹ç¤Ï f77_floatingpoint.h) Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÆþÎϥѥé¥á¡¼¥¿¤Î¼è¤êÆÀ¤ëÃͤϡ¢°Ê²¼¤ÎÄ̤ê¤Ç¤¹¡£

ÆþÎϥѥé¥á¡¼¥¿ C ¤Þ¤¿¤Ï C++ ¤Î·¿ ¼è¤êÆÀ¤ëÃÍ
action char * get¡¢set¡¢clear
exception char * invalid¡¢division¡¢overflow¡¢underflow¡¢inexact¡¢ all¡¢common
handler sigfpe_handler_type ¥æ¡¼¥¶¡¼ÄêµÁ¥ë¡¼¥Á¥ó SIGFPE_DEFAULT SIGFPE_IGNORE SIGFPE_ABORT


action ¤¬ set ¤Î¾ì¹ç¡¢ieee_handler ¤Ï exception ¤Ç»ØÄꤷ¤¿Îã³°¤Ë¤Ä¤¤¤Æ handler ¤Ç»ØÄꤷ¤¿½èÍý´Ø¿ô¤ò³ÎΩ¤·¤Þ¤¹¡£½èÍý´Ø¿ô¤Ï¡¢SIGFPE_DEFAULT ¤ä SIGFPE_IGNORE (¤¤¤º¤ì¤â¥Ç¥Õ¥©¥ë¥È¤Î IEEE Æ°ºî¤òÁªÂò¤¹¤ë)¡¢SIGFPE_ABORT (»ØÄꤷ¤¿Îã³°¤¬È¯À¸¤¹¤ë¤È¥×¥í¥°¥é¥à¤ò°Û¾ï½ªÎ»¤µ¤»¤ë)¡¢¥æ¡¼¥¶¡¼ÄêµÁ¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤Î¥¢¥É¥ì¥¹ (»ØÄꤷ¤¿Îã³°¤Î¤¤¤º¤ì¤«¤¬È¯À¸¤¹¤ë¤È¥µ¥Ö¥ë¡¼¥Á¥ó¤òµ¯Æ°¤¹¤ë) ¤Î¤¤¤º¤ì¤«¤Ç¤¹¡£¥æ¡¼¥¶¡¼ÄêµÁ¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤Ë¤Ï¡¢SA_SIGINFO ¥Õ¥é¥°¤òÀßÄꤷ¤Æ»ØÄꤷ¤¿¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤ÈƱ¤¸¥Ñ¥é¥á¡¼¥¿ (sigaction(2) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È) ¤¬ÅϤµ¤ì¤Þ¤¹¡£¥Ï¥ó¥É¥é¤¬ SIGFPE_DEFAULT ¤Þ¤¿¤Ï SIGFPE_IGNORE ¤Î¾ì¹ç¡¢ieee_handler ¤Ï»ØÄꤷ¤¿Îã³°¤Î¥È¥é¥Ã¥×¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤½¤Î¾¤Î¥Ï¥ó¥É¥é¤Î¾ì¹ç¡¢ieee_handler ¤Ï¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¡¢Îã³°¤Î¥È¥é¥Ã¥×¤¬Í­¸ú¤Ë¤Ê¤êÂбþ¤¹¤ë¥Õ¥é¥°¤¬È¯À¸¤¹¤ë¤¿¤Ó¤Ë¡¢ÉâÆ°¾®¿ôÅÀ¥Ï¡¼¥É¥¦¥§¥¢¤¬¥È¥é¥Ã¥×¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢µ¿»÷¥È¥é¥Ã¥×¤òËɤ°¤Ë¤Ï¡¢ieee_handler ¤ò¸Æ¤Ó½Ð¤·¤Æ¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ëÁ°¤Ë¡¢¥×¥í¥°¥é¥à¤Ï»ØÄꤵ¤ì¤¿Îã³°¤´¤È¤Ë¥Õ¥é¥°¤ò¥¯¥ê¥¢¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

action ¤¬ clear ¤Î¾ì¹ç¡¢ieee_handler ¤Ï»ØÄꤷ¤¿Îã³°¤Ë¤Ä¤¤¤Æ¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë½èÍý´Ø¿ô¤ò¼è¤ê¾Ã¤·¡¢Îã³°¤Î¥È¥é¥Ã¥×¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢SIGFPE_DEFAULT ¤òÀßÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£action ¤¬ clear ¤Î¾ì¹ç¡¢3 ÈÖÌܤΥѥé¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£

action ¤¬ set ¤ª¤è¤Ó clear ¤Î¤¤¤º¤ì¤Î¾ì¹ç¤â¡¢Í׵ᤵ¤ì¤¿Æ°ºî¤¬À®¸ù¤·¤¿¾ì¹ç¤Ï¥¼¥í¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£Æ°ºî¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤Ï¥¼¥í°Ê³°¤ÎÃͤ¬ÊÖ¤µ¤ì¤Þ¤¹¡£

action ¤¬ get ¤Î¾ì¹ç¡¢ieee_handler ¤Ï»ØÄꤷ¤¿Îã³°¤Ë¤Ä¤¤¤Æ¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë¥Ï¥ó¥É¥é (¥Ï¥ó¥É¥é¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï SIGFPE_DEFAULT) ¤Î¥¢¥É¥ì¥¹¤òÊÖ¤·¤Þ¤¹¡£

°Ê²¼¤Ë¡¢ieee_handler ¤Î»ÈÍÑÊýË¡¤ò¼¨¤¹¥³¡¼¥ÉÎã¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î C ¤Î¥³¡¼¥É¤Ç¤Ï¡¢¥¼¥í¤Ë¤è¤ë½ü»»¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï¥×¥í¥°¥é¥à¤ò½ªÎ»¤·¤Þ¤¹¡£

#include <sunmath.h> 
/* x86 ¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¼¡¤Î¹Ô¤Î¥³¥á¥ó¥È¤ò²ò½ü¤·¤Þ¤¹ */
	/*ieee_flags("clear", "exception", "division", NULL); */
    if (ieee_handler("set", "division", SIGFPE_ABORT) != 0)
        printf("ieee trapping not supported here \n"); 

FORTRAN ¤Î¾ì¹ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

#include <f77_floatingpoint.h> 
c x86 ¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¼¡¤Î¹Ô¤Î¥³¥á¥ó¥È¤ò²ò½ü¤·¤Þ¤¹
c			ieee_flags(`clear', `exception', `division', %val(0))
			i = ieee_handler('set', 'division', SIGFPE_ABORT) 
			if(i.ne.0) print *,'ieee trapping not supported here' 

¼¡¤Î C ¤Î¥³¡¼¥É¤Ï¡¢¤¹¤Ù¤Æ¤ÎÎã³°¤Ë¤Ä¤¤¤Æ IEEE ¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÎã³°½èÍý¤ËÌᤷ¤Þ¤¹¡£

#include <sunmath.h> 
    if (ieee_handler("clear", "all", 0) != 0) 
        printf("could not clear exception handlers\n"); 

FORTRAN ¤Î¾ì¹ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

      i = ieee_handler('clear', 'all', 0) 
      if (i.ne.0) print *, 'could not clear exception handlers' 

¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤«¤é¤ÎÎã³°¤ÎÊó¹ð

ieee_handler ¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿ SIGFPE ¥Ï¥ó¥É¥é¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¡¢È¯À¸¤·¤¿Îã³°¤Î·¿¡¢Îã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤Î¥¢¥É¥ì¥¹¡¢¥Þ¥·¥ó¤ÎÀ°¿ô¥ì¥¸¥¹¥¿¤ª¤è¤ÓÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤ÎÆâÍƤò¼¨¤¹¾ðÊó¤¬ÄÌÃΤµ¤ì¤Þ¤¹¡£¥Ï¥ó¥É¥é¤Ï¤³¤Î¾ðÊó¤òÄ´ºº¤·¤Æ¡¢Îã³°¤ÈÎã³°¤ÎȯÀ¸¾ì½ê¤ò¼¨¤¹¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£

¥·¥¹¥Æ¥à¤«¤éÄ󶡤µ¤ì¤ë¾ðÊó¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢¥Ï¥ó¥É¥é¤ò¼¡¤Î¤è¤¦¤ËÀë¸À¤·¤Þ¤¹¡£¤³¤Î¾Ï¤Î°Ê¹ß¤ÎÉôʬ¤Ç¤Ï¡¢C ¤Î¥³¡¼¥ÉÎã¤ò¼¨¤·¤Þ¤¹¡£FORTRAN ¤Î SIGFPE ¥Ï¥ó¥É¥é¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÉÕÏ¿ A¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

#include <siginfo.h>
#include <ucontext.h>

 
void handler(int sig, siginfo_t *sip, ucontext_t *uap)
{
    ...
}

¤³¤Î¥Ï¥ó¥É¥é¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Á÷¤é¤ì¤¿¥·¥°¥Ê¥ë¤ÎÈֹ椬¥Ñ¥é¥á¡¼¥¿ sig ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥·¥°¥Ê¥ëÈÖ¹æ¤Ï sys/siginfo.h Æâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£SIGFPE ¤Î¥·¥°¥Ê¥ëÈÖ¹æ¤Ï 8 ¤Ç¤¹¡£

¥Ñ¥é¥á¡¼¥¿ sip ¤Ï¡¢¥·¥°¥Ê¥ë¤Ë´Ø¤¹¤ëÄɲþðÊó¤òµ­Ï¿¤¹¤ë¹½Â¤ÂΤò»Ø¤·¤Þ¤¹¡£SIGFPE ¥·¥°¥Ê¥ë¤Î¾ì¹ç¡¢¤³¤Î¹½Â¤ÂΤδØÏ¢¥á¥ó¥Ð¡¼¤Ï sip->si_code ¤ª¤è¤Ó sip->si_addr ¤Ç¤¹ (sys/siginfo.h ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£¤³¤ì¤é¤Î¥á¥ó¥Ð¡¼¤Î½ÅÍ×À­¤Ï¡¢¥·¥¹¥Æ¥à¤È¤É¤Î¤è¤¦¤Ê¥¤¥Ù¥ó¥È¤Ç SIGFPE ¥·¥°¥Ê¥ë¤¬È¯À¸¤¹¤ë¤«¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£

sip->si_code ¥á¥ó¥Ð¡¼¤Ï¡¢É½ 4-5 ¤Ë¼¨¤¹ SIGFPE ¥·¥°¥Ê¥ë¤Î·¿¤Î¤¤¤º¤ì¤«¤Ç¤¹¡£¤³¤ì¤é¤Ï sys/machsig.h Æâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ɽ 4-5   »»½ÑÎã³°¤Î·¿ 
SIGFPE ·¿Ì¾ IEEE ·¿
FPE_INTDIV
FPE_INTOVF
FPE_FLTRES
ÉÔÀµ³Î
FPE_FLTDIV
½ü»»
FPE_FLTUND
¥¢¥ó¥À¡¼¥Õ¥í¡¼
FPE_FLTINV
̵¸ú
FPE_FLTOVF
¥ª¡¼¥Ð¡¼¥Õ¥í¡¼


¤³¤Îɽ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢³Æ IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Î·¿¤Ë¤Ï SIGFPE ¥·¥°¥Ê¥ë·¿¤¬Âбþ¤·¤Æ¤¤¤Þ¤¹¡£À°¿ô¤Î¥¼¥í¤Ë¤è¤ë½ü»» (FPE_INTDIV) ¤ª¤è¤ÓÀ°¿ô¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ (FPE_INTOVF) ¤Ï SIGFPE ¤Î·¿¤Ë¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¤³¤ì¤é¤Ï IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢ieee_handler ¤Ç¥Ï¥ó¥É¥é¤òÀßÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤é¤Î SIGFPE ·¿¤Î¥Ï¥ó¥É¥é¤Ï sigfpe(3) ¤ÇÀßÄê¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢À°¿ô¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï SPARC ¤ª¤è¤Ó x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à ¤Î¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¤Ç̵»ë¤µ¤ì¤Þ¤¹¡£Æüì¤ÊÌ¿Îá¤Ë¤è¤Ã¤Æ FPE_INTOVF ·¿¤Î SIGFPE ¥·¥°¥Ê¥ë¤òȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Sun ¤Î¥³¥ó¥Ñ¥¤¥é¤Ï¤³¤Î¤è¤¦¤ÊÌ¿Îá¤òÀ¸À®¤·¤Þ¤»¤ó¡£

IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤ËÂбþ¤¹¤ë SIGFPE ¥·¥°¥Ê¥ë¤Î¾ì¹ç¡¢sip->si_code ¤Î¥á¥ó¥Ð¡¼¤Ï¡¢SPARC ¥·¥¹¥Æ¥à¤Ç¤Ï¤É¤Î¤è¤¦¤ÊÎã³°¤¬È¯À¸¤·¤¿¤«¤ò¼¨¤·¤Þ¤¹¤¬¡¢x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥Õ¥é¥°¤¬Î©¤Ã¤¿ºÇ¤âÍ¥ÀèÅ٤ι⤤Îã³°¤ò¼¨¤·¤Þ¤¹ (ÈóÀµµ¬¥ª¥Ú¥é¥ó¥É¥Õ¥é¥°¤ò½ü¤¯)¡£sip->si_addr ¤Î¥á¥ó¥Ð¡¼¤Ï¡¢SPARC ¥·¥¹¥Æ¥à¤Ç¤ÏÎã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤Î¥¢¥É¥ì¥¹¤òÊÝ»ý¤·¡¢x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥È¥é¥Ã¥×¤µ¤ì¤¿»þÅÀ¤ÎÌ¿Îá (Îã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤Î¼¡¤ÎÉâÆ°¾®¿ôÅÀÌ¿Îá) ¤Î¥¢¥É¥ì¥¹¤òÊÝ»ý¤·¤Þ¤¹¡£

ºÇ¸å¤Ë¡¢¥Ñ¥é¥á¡¼¥¿ uap ¤Ï¥È¥é¥Ã¥×¤µ¤ì¤¿»þÅÀ¤Î¥·¥¹¥Æ¥à¤Î¾õÂÖ¤òµ­Ï¿¤¹¤ë¹½Â¤ÂΤò»Ø¤·¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤÎÆâÍƤϥ·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥á¥ó¥Ð¡¼¤ÎÄêµÁ¤Ë¤Ä¤¤¤Æ¤Ï¡¢sys/reg.h ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤«¤éÄ󶡤µ¤ì¤ë¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢È¯À¸¤·¤¿Îã³°¤Î·¿¤ÈÎã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤Î¥¢¥É¥ì¥¹¤òÊó¹ð¤¹¤ë SIGFPE ¥Ï¥ó¥É¥é¤òºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°Ê²¼¤Î¥³¡¼¥ÉÎã 4-1 ¤Ç¡¢¤³¤Î¤è¤¦¤Ê¥Ï¥ó¥É¥é¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-1   SIGFPE ¥Ï¥ó¥É¥é  

#include <stdio.h>
#include <sys/ieeefp.h>
#include <sunmath.h>
#include <siginfo.h>
#include <ucontext.h>

void handler(int sig, siginfo_t *sip, ucontext_t *uap)
{
    unsigned    code, addr;

#ifdef i386
    unsigned    sw;

    sw = uap->uc_mcontext.fpregs.fp_reg_set.fpchip_state.status &
       ~uap->uc_mcontext.fpregs.fp_reg_set.fpship_state.state[0];
    if (sw & (1 << fp_invalid))
        code = FPE_FLTINV;
else if (sw & (1 << fp_division))
        code = FPE_FLTDIV;
    else if (sw & (1 << fp_overflow))
        code = FPE_FLTOVF;
    else if (sw & (1 << fp_underflow))
        code = FPE_FLTUND;
    else if (sw & (1 << fp_inexact))
        code = FPE_FLTRES;
    else
        code = 0;
    addr = uap->uc_mcontext.fpregs.fp_reg_set.fpchip_state.
       state[3];
#else
    code = sip->si_code;
    addr = (unsigned) sip->si_addr;
#endif
    fprintf(stderr, "fp exception %x at address %x\n", code,
        addr);
}
int main()
{
    double  x;

    /* ¶¦Ä̤ÎÉâÆ°¾®¿ôÅÀÎã³°¤ò¥È¥é¥Ã¥×¤·¤Þ¤¹ */
    if (ieee_handler("set", "common", handler) != 0)
        printf("Did not set exception handler\n");

    /* ¥¢¥ó¥À¡¼¥Õ¥í¡¼Îã³°¤òȯÀ¸¤µ¤»¤Þ¤¹(Êó¹ð¤µ¤ì¤Þ¤»¤ó) */
    x = min_normal();
    printf("min_normal = %g\n", x);
    x = x / 13.0;
    printf("min_normal / 13.0 = %g\n", x);

    /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼Îã³°¤òȯÀ¸¤µ¤»¤Þ¤¹(Êó¹ð¤µ¤ì¤Þ¤¹) */
    x = max_normal();
    printf("max_normal = %g\n", x);
    x = x * x;
    printf("max_normal * max_normal = %g\n", x);
    ieee_retrospective(stderr);
    return 0;
}

SPARC ¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¤³¤Î¥×¥í¥°¥é¥à¤«¤é¤Î½ÐÎϤϼ¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

min_normal = 2.22507e-308
min_normal / 13.0 = 1.7116e-309
max_normal = 1.79769e+308
fp exception 4 at address 10d0c
max_normal * max_normal = 1.79769e+308
 Note: IEEE floating-point exception flags raised:
    Inexact;  Underflow; 
 IEEE floating-point exception traps enabled:
    overflow; division by zero; invalid operation; 
 See the Numerical Computation Guide, ieee_flags(3M), 
ieee_handler(3M)

 
[ÆüËܸìÌõ]
Ãí: °Ê²¼¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤¬È¯À¸¤·¤Þ¤·¤¿:
	ÉÔÀµ³Î¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼
°Ê²¼¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Î¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¤¹:
	¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¥¼¥í¤Ë¤è¤ë½ü»»¡¢Ìµ¸ú¤Ê±é»»
¾ÜºÙ¤Ï¡¢¡Ø¿ôÃÍ·×»»¥¬¥¤¥É¡Ù¤Î ieee_flags(3M), ieee_handler(3M)
¤Ë´Ø¤¹¤ëÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤¬ÎßÀÑÎã³°¥Õ¥é¥°¤òÊݸ¤·¡¢SIGFPE ¥Ï¥ó¥É¥é¤ò¸Æ¤Ó½Ð¤¹Á°¤Ë¤½¤ì¤ò¥¯¥ê¥¢¤·¤Þ¤¹¡£¥Ï¥ó¥É¥é¤Ë¤è¤Ã¤ÆÊݸ¤µ¤ì¤Ê¤¤¸Â¤ê¡¢ÎßÀÑÎã³°¥Õ¥é¥°¤Ï¥Ï¥ó¥É¥é¤«¤éÌᤵ¤ì¤¿¤È¤­¤Ë¼º¤ï¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¾åµ­¤Î¥×¥í¥°¥é¥à¤«¤é¤Î½ÐÎϤˤϥ¢¥ó¥À¡¼¥Õ¥í¡¼Îã³°¤¬È¯À¸¤·¤¿¤³¤È¤¬¼¨¤µ¤ì¤Þ¤»¤ó¡£

min_normal = 2.22507e-308
min_normal / 13.0 = 1.7116e-309
max_normal = 1.79769e+308
fp exception 4 at address 8048fe6
max_normal * max_normal = 1.79769e+308
 Note: IEEE floating-point exception traps enabled: 
    overflow;  division by zero;  invalid operation; 
 See the Numerical Computation Guide, ieee_handler(3M)

 
[ÆüËܸìÌõ]
Ãí: °Ê²¼¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Î¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¤¹:
	¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¥¼¥í¤Ë¤è¤ë½ü»»¡¢Ìµ¸ú¤Ê±é»»
¾ÜºÙ¤Ï¡¢¡Ø¿ôÃÍ·×»»¥¬¥¤¥É¡Ù¤Î ieee_handler(3M)¤Ë´Ø¤¹¤ëÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À
¤µ¤¤¡£

¿¤¯¤Î¾ì¹ç¡¢¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¤¢¤ì¤Ð¡¢Îã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Î᤬ IEEE ¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤òȯÀ¸¤µ¤»¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¾åµ­¤Î½ÐÎϤǤϡ¢max_normal * max_normal ¤ÇÄÌÃΤµ¤ì¤ëÃͤϡ¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¹¤ë±é»»¤Î¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì (Àµ³Î¤ÊÉä¹æÉÕ¤­Ìµ¸ÂÂç) ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾ï¤Ï¡¢°ÕÌ£¤Î¤¢¤ëÃͤò½Ð¤¹·×»»¤ò³¹Ô¤¹¤ë¤¿¤á¤Ë¡¢¥È¥é¥Ã¥×¤µ¤ì¤¿Îã³°¤Î¸¶°ø¤Ç¤¢¤ë±é»»¤Î·ë²Ì¤ò¡¢SIGFPE ¥Ï¥ó¥É¥é¤¬Ä󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ÎÊýË¡¤ÎÎã¤Ï¡¢¡ÖÎã³°½èÍý¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

libm9x.so ¤ÎÎã³°½èÍýµ¡Ç½¤ò»ÈÍѤ·¤ÆÎã³°¤ò¸¡½Ð¤¹¤ë

C ¤ª¤è¤Ó C++ ¥×¥í¥°¥é¥à¤Ç¤Ï¡¢libm9x.so ¤Ë´Þ¤Þ¤ì¤ë C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤ÎÎã³°½èÍýµ¡Ç½¤ò»ÈÍѤ·¡¢¤¤¤¯¤Ä¤«¤ÎÊýË¡¤ÇÎã³°¤ò¸¡½Ð¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î³ÈÄ¥µ¡Ç½¤Ë¤Ï¡¢ieee_handler ¤Ë¤è¤ë½èÍý¤È¤Þ¤Ã¤¿¤¯Æ±Íͤˡ¢¥Ï¥ó¥É¥é¤ò³ÎΩ¤·¤ÆƱ»þ¤Ë¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë´Ø¿ô¤¬´Þ¤Þ¤ì¤Þ¤¹¤¬¡¢¤³¤ì¤é¤Î´Ø¿ô¤Ï ieee_handler ¤è¤ê¤â½ÀÆð¤Ç¤¹¡£¤³¤ì¤é¤Î³ÈÄ¥µ¡Ç½¤Ï¡¢ÁªÂò¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤Ë¤Ä¤¤¤Æ¤ÎÁ̵ڿÇÃÇ¥á¥Ã¥»¡¼¥¸¤Î¥í¥°µ­Ï¿¤â¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£

fex_set_handling(3m)

fex_set_handling ´Ø¿ô¤ò»ÈÍѤ¹¤ë¤È¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤Î¤½¤ì¤¾¤ì¤Î¼ïÎà¤ò½èÍý¤¹¤ë¤¤¤Ä¤¯¤«¤Î¥ª¥×¥·¥ç¥ó (¥â¡¼¥É) ¤Î 1 ¤Ä¤òÁªÂò¤Ç¤­¤Þ¤¹¡£fex_set_handling ¤Î¸Æ¤Ó½Ð¤·¤Î¹½Ê¸¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£

ret = fex_set_handling (ex, mode, handler);

°ú¿ô ex ¤Ï¡¢¸Æ¤Ó½Ð¤·¤òŬÍѤ¹¤ë°ìÏ¢¤ÎÎã³°¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î°ú¿ô¤Ï¡¢¼¡¤Îɽ 4-6 ¤ÎºÇ½é¤ÎÎó¤Ë¼¨¤µ¤ì¤¿ÃͤΥӥåÈñ°Ì¤ÎÏÀÍýϤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤³¤ì¤é¤ÎÃͤϡ¢
fenv.h ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ɽ 4-6   fex_set_handling ¤ÎÎã³°¥³¡¼¥É  
ÃÍ Îã³°
FEX_INEXACT ÉÔÀµ³Î¤Ê·ë²Ì
FEX_UNDERFLOW ¥¢¥ó¥À¡¼¥Õ¥í¡¼
FEX_OVERFLOW ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼
FEX_DIVBYZERO ¥¼¥í½ü»»
FEX_INV_ZDZ 0/0 ̵¸ú±é»»
FEX_INV_IDI ̵¸ÂÂç/̵¸ÂÂç¤Î̵¸ú±é»»
FEX_INV_ISI ̵¸ÂÂç-̵¸ÂÂç¤Î̵¸ú±é»»
FEX_INV_ZMI 0 x ̵¸ÂÂç¤Î̵¸ú±é»»
FEX_INV_SQRT Éé¤Î¿ô¤ÎÊ¿Êýº¬
FEX_INV_SNAN ¥·¥°¥Ê¥ë¤òȯÀ¸¤¹¤ë NaN ¤ËÂФ¹¤ë±é»»
FEX_INV_INT ̵¸ú¤ÊÀ°¿ôÊÑ´¹
FEX_INV_CMP ̵¸ú¤ÊÈó½ç½øÉÕ¤±Èæ³Ó


fenv.h ¤Ï¡¢Êص¹¾å¡¢FEX_NONE (Îã³°¤Ê¤·)¡¢FEX_INVALID (¤¹¤Ù¤Æ¤Î̵¸ú¤Ê±é»»Îã³°)¡¢FEX_COMMON (¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¥¼¥í½ü»»¡¢¤ª¤è¤Ó¤¹¤Ù¤Æ¤Î̵¸ú¤Ê±é»»)¡¢¤ª¤è¤Ó FEX_ALL (¤¹¤Ù¤Æ¤ÎÎã³°) ¤Î³ÆÃͤâÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£

°ú¿ô mode ¤Ï¡¢¼¨¤µ¤ì¤¿Îã³°¤Ë¤Ä¤¤¤ÆÎã³°½èÍý¥â¡¼¥É¤ò³ÎΩ¤¹¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë²Äǽ¤Ê 5 ¤Ä¤Î¥â¡¼¥É¤ò¼¨¤·¤Þ¤¹¡£

»ØÄꤵ¤ì¤¿ mode ¤¬ FEX_NONSTOP¡¢FEX_NOHANDLER¡¢¤Þ¤¿¤Ï FEX_ABORT ¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢handler ¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£fex_set_handling ¤Ï¡¢¼¨¤µ¤ì¤¿Îã³°¤ËÂФ·¤Æ»ØÄꤵ¤ì¤¿¥â¡¼¥É¤¬³ÎΩ¤µ¤ì¤ë¾ì¹ç¤Ï¥¼¥í°Ê³°¤òÊÖ¤·¡¢¤½¤ì°Ê³°¤Ç¤Ï¥¼¥í¤òÊÖ¤·¤Þ¤¹ (¼¡¤ÎÎã¤Ç¤Ï¡¢Ìá¤êÃͤÏ̵»ë¤µ¤ì¤ë)¡£

¼¡¤ÎÎã¤Ï¡¢fex_set_handling ¤ò»ÈÍѤ·¤ÆÆÃÄê¤Î¼ïÎà¤ÎÎã³°¤ò¸¡½Ð¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£0/0 Îã³°¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£

fex_set_handling(FEX_INV_ZDZ, FEX_ABORT, NULL);

¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤È¥¼¥í½ü»»¤ËÂФ·¤Æ SIGFPE ¥Ï¥ó¥É¥é¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£

fex_set_handling(FEX_OVERFLOW | FEX_DIVBYZERO, FEX_SIGNAL, 
handler);

Á°µ­¤ÎÎã¤Ç¤Ï¡¢Á°¤ÎÀá¤Ç¼¨¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢SIGFPE ¥Ï¥ó¥É¥é¤ËÂФ¹¤ë sip ¥Ñ¥é¥á¡¼¥¿¤ò²ð¤·¤Æ¶¡µë¤µ¤ì¤ë¿ÇÃǾðÊó¤ò½ÐÎϤǤ­¤Þ¤·¤¿¡£°ìÊý¡¢¼¡¤ÎÎã¤Ç¤Ï¡¢FEX_CUSTOM ¥â¡¼¥É¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿¥Ï¥ó¥É¥é¤Ë¶¡µë¤µ¤ì¤ëÎã³°¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹ (¾ÜºÙ¤Ï¡¢fex_set_handling(3m) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¥³¡¼¥ÉÎã 4-2   FEX_CUSTOM ¥â¡¼¥É¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿¥Ï¥ó¥É¥é¤Ë¶¡µë¤µ¤ì¤ë¾ðÊó¤Î½ÐÎÏ  

#include <fenv.h>

void handler(int ex, fex_info_t *info)
{
    switch (ex) {
    case FEX_OVERFLOW:
        printf("Overflow in ");
        break;
    case FEX_DIVBYZERO:
        printf("Division by zero in ");
        break;
    default:
        printf("Invalid operation in ");
    }
    switch (info->op) {
    case fex_add:
        printf("floating point add\n");
        break;
    case fex_sub:
        printf("floating point subtract\n");
        break;
    case fex_mul:
        printf("floating point multiply\n");
        break;
    case fex_div:
        printf("floating point divide\n");
        break;
    case fex_sqrt:
        printf("floating point square root\n");
        break;
    case fex_cnvt:
        printf("floating point conversion\n");
        break;
    case fex_cmp:
        printf("floating point compare\n");
        break;
    default:
        printf("unknown operation\n");
    }
    switch (info->op1.type) {
    case fex_int:
        printf("operand 1: %d\n", info->op1.val.i);
        break;
    case fex_llong:
        printf("operand 1: %lld\n", info->op1.val.l);
        break;
    case fex_float:
        printf("operand 1: %g\n", info->op1.val.f);
        break;
    case fex_double:
        printf("operand 1: %g\n", info->op1.val.d);
        break;
    case fex_ldouble:
        printf("operand 1: %Lg\n", info->op1.val.q);
        break;
    }
    switch (info->op2.type) {
    case fex_int:
        printf("operand 2: %d\n", info->op2.val.i);
        break;
    case fex_llong:
        printf("operand 2: %lld\n", info->op2.val.l);
        break;
    case fex_float:
        printf("operand 2: %g\n", info->op2.val.f);
        break;
    case fex_double:
        printf("operand 2: %g\n", info->op2.val.d);
        break;
    case fex_ldouble:
        printf("operand 2: %Lg\n", info->op2.val.q);
        break;
    }
}
...
fex_set_handling(FEX_COMMON, FEX_CUSTOM, handler);

¾åµ­Îã¤Î¥Ï¥ó¥É¥é¤Ï¡¢È¯À¸¤·¤¿Îã³°¤Î¼ïÎà¡¢¸¶°ø¤È¤Ê¤Ã¤¿±é»»¤Î¼ïÎà¡¢¤ª¤è¤Ó¥ª¥Ú¥é¥ó¥É¤òÊó¹ð¤·¤Þ¤¹¡£¤³¤Î¥Ï¥ó¥É¥é¤Ï¡¢Îã³°¤ÎȯÀ¸¾ì½ê¤Ï¼¨¤·¤Þ¤»¤ó¡£Îã³°¤ÎȯÀ¸¾ì½ê¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢Á̵ڿÇÃǤò»ÈÍѤǤ­¤Þ¤¹¡£

Á̵ڿÇÃÇ

libm9x.so ¤ÎÎã³°½èÍýµ¡Ç½¤ò»ÈÍѤ·¤ÆÎã³°¤ò¸¡½Ð¤¹¤ë¤â¤¦ 1 ¤Ä¤ÎÊýË¡¤È¤·¤Æ¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤Ë¤Ä¤¤¤Æ¤ÎÁ̵ڿÇÃÇ¥á¥Ã¥»¡¼¥¸¤Î¥í¥°µ­Ï¿¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤¹¡£Á̵ڿÇÃÇ¤Î¥í¥°µ­Ï¿¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢¥·¥¹¥Æ¥à¤ÏÆÃÄê¤ÎÎã³°¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤òµ­Ï¿¤·¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢Îã³°¤Î¼ïÎà¡¢¤½¤Î¸¶°ø¤È¤Ê¤Ã¤¿Ì¿Îá¤Î¥¢¥É¥ì¥¹¡¢¤½¤Î½èÍýÊýË¡¡¢¤ª¤è¤Ó¥Ç¥Ð¥Ã¥¬¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¤â¤Î¤ËÎà»÷¤·¤¿¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤¬´Þ¤Þ¤ì¤Þ¤¹¡£Á̵ڿÇÃÇ¥á¥Ã¥»¡¼¥¸¤Ëµ­Ï¿¤µ¤ì¤ë¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤Ë¤Ï¡¢Ì¿Îá¤Î¥¢¥É¥ì¥¹¤È´Ø¿ô̾¤·¤«¼¨¤µ¤ì¤Þ¤»¤ó¡£¹ÔÈֹ桢¥½¡¼¥¹¥Õ¥¡¥¤¥ë̾¡¢°ú¿ô¤ÎÃͤΤ褦¤Ê¤Û¤«¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÄ´¤Ù¤ë¤Ë¤Ï¡¢¥Ç¥Ð¥Ã¥¬¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

Á̵ڿÇÃÇ¥í¥°¤Ë¤Ï¡¢È¯À¸¤¹¤ëÎã³°¤´¤È¤Î¾ðÊó¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£Îã³°¤´¤È¤Î¾ðÊó¤òµ­Ï¿¤¹¤ë¤È¤Ê¤ë¤È¡¢µðÂç¤Ê¥í¥°¤È¤Ê¤ê¡¢°Û¾ï¤ÊÎã³°¤òÈ´¤­½Ð¤¹¤³¤È¤ÏÉÔ²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£Âå¤ï¤ê¤Ë¡¢¥í¥®¥ó¥°µ¡¹½¤Ï¾éĹ¤Ê¥á¥Ã¥»¡¼¥¸¤Ï¼è¤ê½ü¤­¤Þ¤¹¡£¥á¥Ã¥»¡¼¥¸¤Ï¡¢¼¡¤Î 2 ¤Ä¤Î¾õ¶·¤Î¤¤¤º¤ì¤«¤Ë¤¢¤ë¾ì¹ç¡¢¾éĹ¤È¸«¤Ê¤µ¤ì¤Þ¤¹¡£

¶ñÂÎŪ¤Ë¤Ï¡¢¤Û¤È¤ó¤É¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¢Îã³°¤Î¤½¤ì¤¾¤ì¤Î¼ïÎबºÇ½é¤ËȯÀ¸¤¹¤ë¾ì¹ç¤À¤±¥í¥°¤Ëµ­Ï¿¤µ¤ì¤Þ¤¹¡£¤¢¤ëÎã³°¤ËÂФ·¤Æ FEX_NONSTOP ½èÍý¥â¡¼¥É¤¬Í­¸ú¤Ê¾ì¹ç¡¢Ç¤°Õ¤Î C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤ò»ÈÍѤ·¤Æ¤½¤Î¥Õ¥é¥°¤ò¥¯¥ê¥¢¤¹¤ë¤È¡¢¤½¤ÎÎã³°¤Î¼¡¤ÎȯÀ¸¤Ï¡¢Ä¾Á°¤Ë¥í¥°µ­Ï¿¤µ¤ì¤¿°ÌÃ֤ǤÎȯÀ¸¤Ç¤Ï¤Ê¤¤¾ì¹ç¤À¤±¥í¥°¤Ëµ­Ï¿¤µ¤ì¤Þ¤¹¡£

¥í¥°µ­Ï¿¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢fex_set_log ´Ø¿ô¤ò»ÈÍѤ·¤Æ¥á¥Ã¥»¡¼¥¸¤òžÁ÷¤¹¤ë¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥á¥Ã¥»¡¼¥¸¤òɸ½à¤Î¥¨¥é¡¼¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£

fex_set_;pg(stderr);

¼¡¤ÎÎã¤Ç¤Ï¡¢Á̵ڿÇÃÇ¤Î¥í¥°µ­Ï¿¤ò¡¢Á°¤ÎÀá¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Î¥×¥ê¥í¡¼¥Éµ¡Ç½¤ÈÁȤ߹ç¤ï¤»¤Æ¤¤¤Þ¤¹¡£¼¡¤Î C ¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¤½¤ì¤ò¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¡¢LD_PRELOAD ´Ä¶­ÊÑ¿ôÆâ¤Ç¤½¤Î¥Ñ¥¹Ì¾¤ò»ØÄꤷ¤Æ¤½¤Î¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ò¥×¥ê¥í¡¼¥É¤·¡¢FTRAP ´Ä¶­ÊÑ¿ô¤Ç 1 ¤Ä°Ê¾å¤ÎÎã³°¤Î̾Á°¤ò¥³¥ó¥Þ¤Ç¶èÀڤäƻØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿Îã³°¤ÎȯÀ¸»þ¤Ë¥×¥í¥°¥é¥à¤òÄä»ß¤¹¤ë¤ÈƱ»þ¤Ë¡¢³ÆÎã³°¤¬¤É¤³¤ÇȯÀ¸¤·¤¿¤«¤ò¼¨¤¹Á̵ڿÇÃǽÐÎϤòÆÀ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-3   Á̵ڿÇÃÇ¤Î¥í¥°µ­Ï¿¤È¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Î¥×¥ê¥í¡¼¥Éµ¡Ç½¤È¤ÎÁȤ߹ç¤ï¤»  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fenv.h>

static struct ftrap_string {
    const char  *name;
    int         value;
} ftrap_table[] = {
    { "inexact", FEX_INEXACT },
    { "division", FEX_DIVBYZERO },
    { "underflow", FEX_UNDERFLOW },
    { "overflow", FEX_OVERFLOW },
    { "invalid", FEX_INVALID },
    { NULL, 0 }
};

#pragma init (set_ftrap)
void set_ftrap()
{
    struct ftrap_string  *f;
    char                 *s, *s0;
    int                  ex = 0;

    if ((s = getenv("FTRAP")) == NULL)
        return;

    if ((s0 = strtok(s, ",")) == NULL)
        return;

    do {
        for (f = &trap_table[0]; f->name != NULL; f++) {
            if (!strcmp(s0, f->name))
                ex |= f->value;
        }
    } while ((s0 = strtok(NULL, ",")) != NULL);

    fex_set_handling(ex, FEX_ABORT, NULL);
    fex_set_log(stderr);
}

¾åµ­¤Î¥³¡¼¥É¤ò¤³¤ÎÀá¤Î½é¤á¤Ç¼¨¤·¤Æ¤¤¤ë¥×¥í¥°¥é¥àÎã¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤È¡¢¼¡¤Î¤è¤¦¤Ê·ë²Ì¤¬½ÐÎϤµ¤ì¤Þ¤¹ (SPARC ¤Î¾ì¹ç)¡£

example% cc -Kpic -G -ztext init.c -o init.so -R/opt/SUNWspro/lib 
-L/opt/SUNWspro/lib -lm9x -lc
example% env FTRAP=invalid LD_PRELOAD=./init.so a.out
Floating point invalid operation (sqrt) at 0x00010c24 sqrtm1_, 
abort
  0x00010c30  sqrtm1_
  0x00010b48  MAIN_
  0x00010ccc  main
Abort

¤³¤Î½ÐÎϤϡ¢¥ë¡¼¥Á¥ó sqrtm1 Æâ¤ÎÊ¿Êýº¬±é»»¤Î·ë²Ì¤È¤·¤Æ̵¸ú¤Ê±é»»Îã³°¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£

¾åµ­¤Ç¿¨¤ì¤¿¤è¤¦¤Ë¡¢x86 ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤ª¤¤¤Æ¶¦Í­¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤Î½é´ü²½¥ë¡¼¥Á¥ó¤«¤é¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢É¸½à¤Î __fpstart ¥ë¡¼¥Á¥ó¤ò̵¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

ŵ·¿Åª¤Ê¥í¥°½ÐÎϤò¼¨¤·¤¿Îã¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÉÕÏ¿ A¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢°ìÈÌŪ¤Ê¾ðÊó¤Ë¤Ä¤¤¤Æ¤Ï¡¢fex_set_log(3m) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

Îã³°½èÍý

Îò»ËŪ¤Ë¡¢(¤µ¤Þ¤¶¤Þ¤ÊÍýͳ¤«¤é) ¿ôÃÍ·×»»¥½¥Õ¥È¥¦¥§¥¢¤ÏÎã³°¤ò¹Í褻¤º¤ËºîÀ®¤µ¤ì¤Æ¤­¤Þ¤·¤¿¡£¤Þ¤¿¡¢Â¿¤¯¤Î¥×¥í¥°¥é¥Þ¤Ï¡¢Îã³°¤¬È¯À¸¤¹¤ë¤È¥×¥í¥°¥é¥à¤¬¤¿¤À¤Á¤Ë°Û¾ï½ªÎ»¤¹¤ë¤È¤¤¤¦´Ä¶­¤Ë´·¤ì¤Æ¤¤¤Þ¤·¤¿¡£¸½ºß¤Ç¤Ï¡¢LAPACK ¤Ê¤É¤Î¹âÉʼÁ¤Ê¥½¥Õ¥È¥¦¥§¥¢¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¡¢¥¼¥í¤Ë¤è¤ë½ü»»¤ä̵¸ú¤Ê±é»»¤Ê¤É¤ÎÎã³°¤ò²óÈò¤·¡¢ÆþÎϤò´ð½à²½ (¥¹¥±¡¼¥ë) ¤·¤Æ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ä·ë²Ì¤¬ÉÔÀµ³Î¤Ë¤Ê¤ë²ÄǽÀ­¤Î¤¢¤ë¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ò½ü³°¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¤è¤¦¤ËÎã³°¤ò½èÍý¤¹¤ëÊýË¡¤Ï¡¢¤É¤Î¤è¤¦¤Ê¾õ¶·¤Ç¤âŬÀڤǤ¢¤ë¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£Îã³°¤ò̵»ë¤¹¤ë¤È¡¢¤¢¤ë¥×¥í¥°¥é¥Þ¤¬ºîÀ®¤·¤¿¥×¥í¥°¥é¥à¤ä¥µ¥Ö¥ë¡¼¥Á¥ó¤ò¡¢(¥½¡¼¥¹¥³¡¼¥É¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤) ¾¤Î¥×¥í¥°¥é¥Þ¤¬»ÈÍѤ¹¤ë¾ì¹ç¤Ë¡¢ÌäÂê¤È¤Ê¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¹¤Ù¤Æ¤ÎÎã³°¤ò²óÈò¤·¤è¤¦¤È¤¹¤ë¤È¡¢Â¿¤¯¤Î¥Æ¥¹¥È¤Èʬ´ô¤¬É¬ÍפˤʤꡢÈó¾ï¤Ë¼ê´Ö¤¬¤«¤«¤ê¤Þ¤¹ (Demmel¡¢Li ¶¦Ãø¡ØFaster Numerical Algorithms via Exception Handling¡ÙIEEE Trans. Comput. 43¡¢1994 ǯ), pp. 983-992 ¤ò»²¾È)¡£

Âè 3 ¤ÎÁªÂò»è¤È¤·¤Æ¡¢IEEE »»½Ñ±é»»¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÎã³°±þÅú¤ä¾õÂ֥ե饰¡¢¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤Î¥È¥é¥Ã¥×µ¡Ç½¤Ë¤è¤Ã¤Æ¡¢Îã³°¤¬È¯À¸¤·¤Æ¤â·×»»¤ò³¹Ô¤·¤Æ¸å¤ÇÎã³°¤ò¸¡½Ð¤¹¤ë¤«¡¢È¯À¸»þ¤Ë²ò¼á¤ª¤è¤Ó½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Á°½Ò¤Î¤è¤¦¤Ë¡¢ieee_flags ¤ä C99 ÉâÆ°¾®¿ôÅÀ´Ä¶­´Ø¿ô¤ò»ÈÍѤ·¤Æ¸å¤ÇÎã³°¤ò¸¡½Ð¤·¤¿¤ê¡¢ieee_handler ¤ä fex_set_handling ¤ò»ÈÍѤ·¤Æ¥È¥é¥Ã¥×¤òÍ­¸ú¤Ë¤·¡¢È¯À¸»þ¤ËÎã³°¤ò²ò¼á¤¹¤ë SIGFPE ¥Ï¥ó¥É¥é¤òÀßÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£·×»»¤ò³¹Ô¤¹¤ë¤¿¤á¤Ë¡¢IEEE µ¬³Ê¤Ç¤Ï¡¢Îã³°¤Î¸¶°ø¤È¤Ê¤Ã¤¿±é»»¤Î·ë²Ì¤ò¥È¥é¥Ã¥×¥Ï¥ó¥É¥é¤Ç»ØÄꤹ¤ë¤è¤¦¤Ë¿ä¾©¤·¤Æ¤¤¤Þ¤¹¡£FEX_SIGNAL ¥â¡¼¥É¤Ç ieee_handler ¤Þ¤¿¤Ï fex_set_handling ¤ò²ð¤·¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤ë SIGFPE ¥Ï¥ó¥É¥é¤Ï¡¢Solaris ¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°´Ä¶­¤¬¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¶¡µë¤·¤Æ¤¤¤ë uap ¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£fex_set_handling ¤ò²ð¤·¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤ë FEX_CUSTOM ¥â¡¼¥É¥Ï¥ó¥É¥é¤Ï¡¢¤³¤Î¤è¤¦¤Ê¥Ï¥ó¥É¥é¤Ë¶¡µë¤µ¤ì¤ë info ¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ·ë²Ì¤òÄ󶡤Ǥ­¤Þ¤¹¡£

C ¤Ç¤Ï¡¢SIGFPE ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¼¡¤Î¤è¤¦¤ËÀë¸À¤·¤Þ¤¹¡£

#include <siginfo.h>
#include <ucontext.h>

 
void handler(int sig, siginfo_t *sip, ucontext_t *uap)
{
    ...
}

¥È¥é¥Ã¥×¤µ¤ì¤¿ÉâÆ°¾®¿ôÅÀÎã³°¤Î·ë²Ì¤È¤·¤Æ SIGFPE ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢uap ¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¤½¤Î¥³¥ó¥Ô¥å¡¼¥¿¤ÎÀ°¿ô¥ì¥¸¥¹¥¿¤ª¤è¤ÓÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤Î¥³¥Ô¡¼¤ä¡¢¤½¤Î¾¤ÎÎã³°¤¬µ­½Ò¤µ¤ì¤Æ¤¤¤ë¥·¥¹¥Æ¥à°Í¸¤Î¾ðÊó¤ò³ÊǼ¤·¤¿¥Ç¡¼¥¿¹½Â¤ÂΤò»Ø¤·¤Þ¤¹¡£¤³¤Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤¬Àµ¾ï¤ËÊÖ¤µ¤ì¤ë¤È¡¢Êݸ¤µ¤ì¤¿¥Ç¡¼¥¿¤¬Éü¸µ¤µ¤ì¡¢¥È¥é¥Ã¥×¤¬¹Ô¤ï¤ì¤¿²Õ½ê¤«¤é¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤¬ºÆ³«¤µ¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ë¡¢Îã³°¤òµ­½Ò¤·¤¿¥Ç¡¼¥¿¹½Â¤ÂΤξðÊó¤Ë¥¢¥¯¥»¥¹¤·¤Æ²òÆɤ·¡¢²Äǽ¤Ç¤¢¤ì¤ÐÊݸ¤µ¤ì¤¿¥Ç¡¼¥¿¤òÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢SIGFPE ¥Ï¥ó¥É¥é¤ÏÎã³°±é»»¤Î·ë²Ì¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤷ¤¿ÃͤËÃÖ´¹¤·¤Æ·×»»¤ò³¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

FEX_CUSTOM ¥â¡¼¥É¥Ï¥ó¥É¥é¤Ï¡¢¼¡¤ÎÊýË¡¤ÇÀë¸À¤Ç¤­¤Þ¤¹¡£

#include <fenv.h>

 
void handler(int ex, fex_info_t *info)
{
    ...
}

FEX_CUSTOM ¥Ï¥ó¥É¥é¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¤­¡¢ex ¥Ñ¥é¥á¡¼¥¿¤Ï¤É¤Î¼ïÎà¤ÎÎã³°¤¬È¯À¸¤·¤¿¤« (ɽ 4-6 ¤Ëµó¤²¤é¤ì¤¿ÃͤΠ1 ¤Ä) ¤ò¼¨¤·¡¢info ¥Ñ¥é¥á¡¼¥¿¤Ï¤½¤ÎÎã³°¤Î¾ÜºÙ¾ðÊó¤ò´Þ¤à¥Ç¡¼¥¿¹½Â¤¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î¥Ç¡¼¥¿¹½Â¤¤Ï¡¢Îã³°¤ÎȯÀ¸¸¶°ø¤Ç¤¢¤ë»»½Ñ±é»»¤òɽ¸½¤¹¤ë¥³¡¼¥É¤È¡¢¥ª¥Ú¥é¥ó¥É¤òµ­Ï¿¤¹¤ë¹½Â¤ÂÎ (ÍøÍѤǤ­¤ë¾ì¹ç) ¤ò´Þ¤ß¤Þ¤¹¡£¤Þ¤¿¡¢Îã³°¤¬¥È¥é¥Ã¥×¤µ¤ì¤Ê¤¤¾ì¹ç¤ËÃÖ´¹¤µ¤ì¤Æ¤¤¤¿¤Ï¤º¤Î¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤òµ­Ï¿¤¹¤ë¹½Â¤ÂΤȡ¢È¯À¸¤·¤¿¤Ï¤º¤ÎÎã³°¥Õ¥é¥°¤Î¥Ó¥Ã¥Èñ°Ì¤ÎÏÀÍýϤòÊÝ»ý¤¹¤ëÀ°¿ôÃͤâ´Þ¤ß¤Þ¤¹¡£¥Ï¥ó¥É¥é¤Ï¡¢¤³¤Î 2 ¤Ä¤Î¾ðÊó¤òÊѹ¹¤·¤Æ°Û¤Ê¤ë·ë²Ì¤ËÃÖ¤­´¹¤¨¤¿¤ê¡¢È¯À¸¤·¤¿¥Õ¥é¥°¤Î¥»¥Ã¥È¤òÊѹ¹¤·¤¿¤ê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Ç¡¼¥¿¤òÊѹ¹¤¹¤ë¤³¤È¤Ê¤¯¥Ï¥ó¥É¥é¤¬Ìá¤ë¾ì¹ç¡¢¥×¥í¥°¥é¥à¤Ï¡¢Îã³°¤¬¥È¥é¥Ã¥×¤µ¤ì¤Ê¤¤¤«¤Î¤è¤¦¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥È¥é¥Ã¥×¤µ¤ì¤Ê¤¤·ë²Ì¤È¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ·Ñ³¤·¤Þ¤¹¡£

¼¡¤ÎÀá¤Ë¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Ë¤Ê¤ë±é»»¤ò´ð½à²½ (¥¹¥±¡¼¥ë) ¤µ¤ì¤¿·ë²Ì¤ËÃÖ´¹¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢ÉÕÏ¿ A¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

IEEE ¥È¥é¥Ã¥×¤µ¤ì¤¿¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ª¤è¤Ó¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ÎÃÖ´¹

IEEE µ¬³Ê¤Ç¤Ï¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ª¤è¤Ó¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬¥È¥é¥Ã¥×¤µ¤ì¤¿¾ì¹ç¡¢»Ø¿ôÉô¤¬¥é¥Ã¥× (wrap) ¤µ¤ì¤¿·ë²Ì¤ò¥È¥é¥Ã¥×¥Ï¥ó¥É¥é¤Ë¤è¤Ã¤ÆÃÖ´¹¤Ç¤­¤ë¤è¤¦¤ÊÊýË¡¤ò¥·¥¹¥Æ¥à¤ÇÄ󶡤¹¤ë¤è¤¦¤Ë¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£»Ø¿ôÉô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤Ï¡¢»Ø¿ôÉô¤¬¤½¤ÎÄ̾ï¤ÎÈϰϤòĶ¤¨¤Æ¥é¥Ã¥×¤µ¤ì¤Æ¤¤¤ë¤È¤¤¤¦¤³¤È¤ò½ü¤±¤Ð¡¢¤½¤ÎÃͤϥª¡¼¥Ð¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥¢¥ó¥À¡¼¥Õ¥í¡¼¤òµ¯¤³¤µ¤º¤Ë±é»»¤¬¹Ô¤ï¤ì¤¿¾ì¹ç¤Î·ë²Ì¤È°ìÃפ·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Ãͤ¬ 2 ¤Î¤Ù¤­¾è¤Ë¤è¤Ã¤Æ´ð½à²½ (¥¹¥±¡¼¥ë) ¤µ¤ì¤Æ¤¤¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£°Ê¹ß¤Î·×»»¤Ç¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ä¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬È¯À¸¤·¤Ê¤¤¤è¤¦¤Ë¡¢»Ø¿ôÈϰϤÎÃæ±û¤Ë¤Ç¤­¤ë¤À¤±¶á¤¯¤Ë¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤È¤Ê¤Ã¤¿·ë²Ì¤ò³ä¤êÅö¤Æ¤ë¤è¤¦¤ÊÇÜΨ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£È¯À¸¤·¤¿¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ä¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Î²ó¿ô¤òÄÉÀפ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥×¥í¥°¥é¥à¤ÏºÇ½ªÅª¤Ê·ë²Ì¤ò´ð½à²½ (¥¹¥±¡¼¥ë) ¤·¡¢¥é¥Ã¥×¤µ¤ì¤¿»Ø¿ô¤òÊäÀµ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢Í­¸ú¤ÊÉâÆ°¾®¿ôÅÀ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎÈϰϤòĶ¤¨¤Æ¤·¤Þ¤¦¤è¤¦¤Ê·×»»¤Ë¤ª¤¤¤Æ¡¢Àµ³Î¤Ê·ë²Ì¤ò½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹ (P. Sterbenz Ãø¡ØFloating-Point Computation¡Ù¤ò»²¾È)¡£

SPARC ¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢ÉâÆ°¾®¿ôÅÀÌ¿Î᤬¥È¥é¥Ã¥×¤µ¤ì¤¿Îã³°¤Î¸¶°ø¤Ç¤¢¤ë¾ì¹ç¡¢¥·¥¹¥Æ¥à¤Ï°¸Àè¥ì¥¸¥¹¥¿¤òÊѹ¹¤·¤Þ¤»¤ó¡£¤³¤Î¤¿¤á¡¢»Ø¿ô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤òÃÖ´¹¤¹¤ë¤Ë¤Ï¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Î¥Ï¥ó¥É¥é¤¬Ì¿Îá¤ò¥Ç¥³¡¼¥É¤·¡¢¥ª¥Ú¥é¥ó¥É¥ì¥¸¥¹¥¿¤òÄ´¤Ù¡¢´ð½à²½ (¥¹¥±¡¼¥ë) ¤µ¤ì¤¿·ë²Ì¼«ÂΤòÀ¸À®¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¤³¤Î¼ê½ç¤ò¼Â¹Ô¤¹¤ë¥Ï¥ó¥É¥é¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î¥Ï¥ó¥É¥é¤ò UltraSPARC ¥·¥¹¥Æ¥à¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤Ç»ÈÍѤ¹¤ë¤Ë¤Ï¡¢Solaris 2.6¡¢Solaris 7¡¢¤Þ¤¿¤Ï Solaris 8 ¤ò¼Â¹Ô¤¹¤ë¥·¥¹¥Æ¥à ¾å¤Ç¤³¤Î¥Ï¥ó¥É¥é¤ò¥³¥ó¥Ñ¥¤¥ë¤·¡¢¥×¥ê¥×¥í¥»¥Ã¥µ¥È¡¼¥¯¥ó V8PLUS ¤òÄêµÁ¤·¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-4   SPARC ¥·¥¹¥Æ¥à¤Ç¤Î¡¢IEEE ¥È¥é¥Ã¥×¤µ¤ì¤¿¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ª¤è¤Ó¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ÎÃÖ´¹ 

 
#include <stdio.h>
#include <ieeefp.h>
#include <math.h>
#include <sunmath.h>
#include <siginfo.h>
#include <ucontext.h>


 
#ifdef V8PLUS
/* ¾å°Ì 32 ¥Ó¥Ã¥È¤ÎÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤Ï¡¢uap->uc_mcontext.xrs.xrs_prt 
¤Ë¤è¤Ã¤Æ¼¨¤µ¤ì¤ëÎΰè¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥Ý¥¤¥ó¥¿¤Ï¡¢
uap->mcontext.xrs.xrs_id == XRS_ID
(sys/procfs.h ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë) ¤Î¾ì¹ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£ */
#include <assert.h>
#include <sys/procfs.h>
#define FPxreg(x)  ((prxregset_t*)uap->uc_mcontext.xrs.xrs_ptr)
->pr_un.pr_v8p.pr_xfr.pr_regs[(x)]
#endif

#define FPreg(x)   uap->uc_mcontext.fpregs.fpu_fr.fpu_regs[(x)]

/*
*  ¥È¥é¥Ã¥×¤µ¤ì¤¿¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Ë¤Ä¤¤¤Æ¡¢
*  IEEE 754 ¤Î¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤¬Ä󶡤µ¤ì¤Þ¤¹
*/
void
ieee_trapped_default(int sig, siginfo_t *sip, ucontext_t *uap)
{
    unsigned    instr, opf, rs1, rs2, rd;
    long double qs1, qs2, qd, qscl;
    double      ds1, ds2, dd, dscl;
    float       fs1, fs2, fd, fscl;

    /* Îã³°¤Î¸¶°ø¤È¤Ê¤Ã¤Æ¤¤¤ëÌ¿Îá¤ò¼èÆÀ */
    instr = uap->uc_mcontext.fpregs.fpu_q->FQu.fpq.fpq_instr;

    /* ±é»»¥³¡¼¥É¡¢¥½¡¼¥¹¡¢°¸Àè¥ì¥¸¥¹¥¿ÈÖ¹æ¤òÃê½Ð */
    opf = (instr >> 5) & 0x1ff;
    rs1 = (instr >> 14) & 0x1f;
    rs2 = instr & 0x1f;
    rd = (instr >> 25) & 0x1f;

    /* ¥ª¥Ú¥é¥ó¥É¤ò¼èÆÀ */
    switch (opf & 3) {
    case 1: /* single precision */
        fs1 = *(float*)&FPreg(rs1);
        fs2 = *(float*)&FPreg(rs2);
        break;

    case 2: /* ÇÜÀºÅÙ */
#ifdef V8PLUS
        if (rs1 & 1)
        {
            assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
            ds1 = *(double*)&FPxreg(rs1 & 0x1e);
        }
        else
            ds1 = *(double*)&FPreg(rs1);
        if (rs2 & 1)
        {
            assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
            ds2 = *(double*)&FPxreg(rs2 & 0x1e);
        }
        else
            ds2 = *(double*)&FPreg(rs2);
#else
        ds1 = *(double*)&FPreg(rs1);
        ds2 = *(double*)&FPreg(rs2);
#endif
        break;

    case 3: /* 4 ÇÜÀºÅÙ */
#ifdef V8PLUS
        if (rs1 & 1)
        {
            assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
            qs1 = *(long double*)&FPxreg(rs1 & 0x1e);
        }
        else
            qs1 = *(long double*)&FPreg(rs1);
        if (rs2 & 1)
        {
            assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
            qs2 = *(long double*)&FPxreg(rs2 & 0x1e);
        }
        else
            qs2 = *(long double*)&FPreg(rs2);
#else
        qs1 = *(long double*)&FPreg(rs1);
        qs2 = *(long double*)&FPreg(rs2);

#endif
        break;
    }

    /* ÇÜΨ¤òÀßÄê */
    if (sip->si_code == FPE_FLTOVF) {
        fscl = scalbnf(1.0f, -96);
        dscl = scalbn(1.0, -768);
        qscl = scalbnl(1.0, -12288);
    } else {
        fscl = scalbnf(1.0f, 96);
        dscl = scalbn(1.0, 768);
        qscl = scalbnl(1.0, 12288);
    }

    /* ¥È¥é¥Ã¥×¤ò̵¸ú¤Ë¤·¤Æ´ð½à²½(¥¹¥±¡¼¥ë)¤µ¤ì¤¿·ë²Ì¤òÀ¸À® */
    fpsetmask(0);
    switch (opf) {
    case 0x41: /* ñÀºÅ٤βû» */
        fd = fscl * (fscl * fs1 + fscl * fs2);
        break;

    case 0x42: /* ÇÜÀºÅ٤βû» */
        dd = dscl * (dscl * ds1 + dscl * ds2);
        break;

    case 0x43: /* 4 ÇÜÀºÅ٤βû» */
        qd = qscl * (qscl * qs1 + qscl * qs2);
        break;

    case 0x45: /* ñÀºÅ٤θº»» */
        fd = fscl * (fscl * fs1 - fscl * fs2);
        break;

    case 0x46: /* ÇÜÀºÅ٤θº»» */
        dd = dscl * (dscl * ds1 - dscl * ds2);
        break;

    case 0x47: /* 4 ÇÜÀºÅ٤θº»» */
        qd = qscl * (qscl * qs1 - qscl * qs2);
        break;

    case 0x49: /* ñÀºÅ٤ξ軻 */
        fd = (fscl * fs1) * (fscl * fs2);
        break;

    case 0x4a: /* ÇÜÀºÅ٤ξ軻 */
        dd = (dscl * ds1) * (dscl * ds2);
        break;

    case 0x4b: /* 4 ÇÜÀºÅ٤ξ軻 */
        qd = (qscl * qs1) * (qscl * qs2);
        break;

    case 0x4d: /* ñÀºÅ٤νü»» */
        fd = (fscl * fs1) / (fs2 / fscl);
        break;

    case 0x4e: /* ÇÜÀºÅ٤νü»» */
        dd = (dscl * ds1) / (ds2 / dscl);
        break;

    case 0x4f: /* 4 ÇÜÀºÅ٤νü»» */
        qd = (qscl * qs1) / (qs2 / dscl);
        break;

    case 0xc6: /* ÇÜÀºÅÙ¤òñÀºÅÙ¤ËÊÑ´¹ */
        fd = (float) (fscl * (fscl * ds1));
        break;

    case 0xc7: /* 4 ÇÜÀºÅÙ¤òñÀºÅÙ¤ËÊÑ´¹ */
        fd = (float) (fscl * (fscl * qs1));
        break;

    case 0xcb: /* 4 ÇÜÀºÅÙ¤òÇÜÀºÅÙ¤ËÊÑ´¹ */
        dd = (double) (dscl * (dscl * qs1));
        break;
    }

    /* °¸Àè¤Ë·ë²Ì¤ò³ÊǼ */
    if (opf & 0x80) {
        /* ÊÑ´¹±é»» */
        if (opf == 0xcb) {
            /* 4 ÇÜÀºÅÙ¤òÇÜÀºÅÙ¤ËÊÑ´¹ */
#ifdef V8PLUS
            if (rd & 1)
            {
                assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
                *(double*)&FPxreg(rd & 0x1e) = dd;
            }
            else
                *(double*)&FPreg(rd) = dd;
#else
            *(double*)&FPreg(rd) = dd;
#endif
        } else
            /* 4 ÇÜÀºÅÙ/ÇÜÀºÅÙ¤òñÀºÅÙ¤ËÊÑ´¹ */
            *(float*)&FPreg(rd) = fd;
    } else {
        /* »»½Ñ±é»» */
        switch (opf & 3) {
        case 1: /* ñÀºÅÙ */
            *(float*)&FPreg(rd) = fd;
            break;

        case 2: /* ÇÜÀºÅÙ */
#ifdef V8PLUS
            if (rd & 1)
            {
                assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
                *(double*)&FPxreg(rd & 0x1e) = dd;
            }
            else
                *(double*)&FPreg(rd) = dd;
#else
            *(double*)&FPreg(rd) = dd;
#endif
            break;

        case 3: /* 4 ÇÜÀºÅÙ */
#ifdef V8PLUS
            if (rd & 1)
            {
                assert(uap->uc_mcontext.xrs.xrs_id == XRS_ID);
                *(long double*)&FPxreg(rd & 0x1e) = qd;
            }


 
            else
                *(long double*)&FPreg(rd & 0x1e) = qd;
#else
            *(long double*)&FPreg(rd & 0x1e) = qd;
#endif
            break;
        }
    }
}

int
main()
{
    volatile float   a, b;
    volatile double  x, y;

    ieee_handler("set", "underflow", ieee_trapped_default);
    ieee_handler("set", "overflow", ieee_trapped_default);

    a = b = 1.0e30f;
    a *= b; /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ; ŬÀڤʿô¤Ë¥é¥Ã¥×¤µ¤ì¤ë */
    printf( "%g\n", a );
    a /= b;
    printf( "%g\n", a );
    a /= b; /* ¥¢¥ó¥À¡¼¥Õ¥í¡¼ ; µÕÊý¸þ¤Ë¥é¥Ã¥×¤µ¤ì¤ë */
    printf( "%g\n", a );

    x = y = 1.0e300;
    x *= y; /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ; ŬÀڤʿô¤Ë¥é¥Ã¥×¤µ¤ì¤ë */
    printf( "%g\n", x );
    x /= y;
    printf( "%g\n", x );
    x /= y; /* ¥¢¥ó¥À¡¼¥Õ¥í¡¼ ; µÕÊý¸þ¤Ë¥é¥Ã¥×¤µ¤ì¤ë */
    printf( "%g\n", x );

    ieee_retrospective(stdout);
    return 0;
}


¤³¤ÎÎã¤ÇÊÑ¿ô a¡¢b¡¢x¡¢¤ª¤è¤Ó y ¤¬ volatile ¤ÈÀë¸À¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤Ë a * b ¤Ê¤É¤òɾ²Á¤¹¤ë¤³¤È¤òËɤ°¤¿¤á¤Ë¤¹¤®¤Þ¤»¤ó¡£Ä̾ï¤Î»ÈÍѤǤϡ¢volatile Àë¸À¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£

¾åµ­¤Î¥×¥í¥°¥é¥à¤Î½ÐÎϤϡ¢°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£

159.309
1.59309e-28
1
4.14884e+137
4.14884e-163
1
 Note: IEEE floating-point exception traps enabled:
    underflow;  overflow;
 See the Numerical Computation Guide, ieee_handler(3M)

 
[ÆüËܸìÌõ]
Ãí: °Ê²¼¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Î¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¤¹:
	¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼
¾ÜºÙ¤Ï¡¢¡Ø¿ôÃÍ·×»»¥¬¥¤¥É¡Ù¤Î ieee_handler(3M)¤Ë´Ø¤¹¤ëÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À
¤µ¤¤¡£

x86 ¤Ç¤Ï¡¢ÉâÆ°¾®¿ôÅÀÌ¿Îá¤Ë¤è¤Ã¤Æ¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬¥È¥é¥Ã¥×¤µ¤ì¡¢¤½¤Î°¸À褬¥ì¥¸¥¹¥¿¤Ç¤¢¤ë¾ì¹ç¡¢ÉâÆ°¾®¿ôÅÀ¥Ï¡¼¥É¥¦¥§¥¢¤Ë¤è¤Ã¤Æ»Ø¿ô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤¬Ä󶡤µ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢ÉâÆ°¾®¿ôÅÀ¤Î¥¹¥È¥¢Ì¿Îá¤Ç¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬¥È¥é¥Ã¥×¤µ¤ì¤ë»þ¤Ë¤Ï¡¢¥Ï¡¼¥É¥¦¥§¥¢¤Ï¥¹¥È¥¢¤¬Ì¤´°Î»¤Î¤Þ¤Þ¥È¥é¥Ã¥×¤ò¹Ô¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¤½¤ÎÌ¿Î᤬¥¹¥È¥¢¤ª¤è¤Ó¥Ý¥Ã¥×¤ÎÌ¿Îá¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢¥¹¥¿¥Ã¥¯¤Î¥Ý¥Ã¥×¤â¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤³¤Î¤¿¤á¡¢¥¹¥È¥¢Ì¿Îá¤Ë¤ª¤¤¤Æ¥È¥é¥Ã¥×¤¬È¯À¸¤·¤¿»þ¤Î¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Î¿ô¤òÄÉÀפ¹¤ë¤Ë¤Ï¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Î¥Ï¥ó¥É¥é¤¬´ð½à²½ (¥¹¥±¡¼¥ë) ¤µ¤ì¤¿·ë²Ì¤òÀ¸À®¤·¡¢¥¹¥¿¥Ã¥¯¤ò½¤Àµ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Ï¥ó¥É¥é¤ò¡¢°Ê²¼¤ÎÎã¤Ç¼¨¤·¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-5   x86 ¥·¥¹¥Æ¥à¤Ç¤Î IEEE ¥È¥é¥Ã¥×¤µ¤ì¤¿¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ª¤è¤Ó¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ÎÃÖ´¹ 

 
#include <stdio.h>
#include <ieeefp.h>
#include <math.h>
#include <sunmath.h>
#include <siginfo.h>
#include <ucontext.h>

/* Êݸ¤µ¤ì¤¿ fp ´Ä¶­¤Ø¤Î¥ª¥Õ¥»¥Ã¥È */
#define CW    0    /* À©¸æ¥ï¡¼¥É */
#define SW    1    /* ¥¹¥Æ¡¼¥¿¥¹¥ï¡¼¥É */
#define TW    2    /* ¥¿¥°¥ï¡¼¥É */
#define OP    4    /* ±é»»¥³¡¼¥É */
#define EA    5    /* ¥ª¥Ú¥é¥ó¥É¤Î¥¢¥É¥ì¥¹ */

#define FPenv(x)    uap->uc_mcontext.fpregs.fp_reg_set.
fpchip_state.state[(x)]

#define FPreg(x)    *(long double *)(10*(x)+(char*)&uap->
uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[7])

/*
*  ¥È¥é¥Ã¥×¤µ¤ì¤¿¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤Ë¤Ä¤¤¤Æ
*   IEEE 754 ¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤òÄó¶¡
*/
void
ieee_trapped_default(int sig, siginfo_t *sip, ucontext_t *uap)
{
    double      dscl;
    float       fscl;
    unsigned    sw, op, top;
    int         mask, e;

    /* ¥È¥é¥Ã¥×¤µ¤ì¤Ê¤«¤Ã¤¿Îã³°¤Î¥Õ¥é¥°¤òÊݸ */
    sw = uap->uc_mcontext.fpregs.fp_reg_set.fpchip_state.status;
    FPenv(SW) |= (sw & (FPenv(CW) & 0x3f));

    /* Îã³°¤È¤Ê¤Ã¤¿Ì¿Î᤬µ­²±Îΰè¤Ë¤¢¤ë¾ì¹ç¡¢¥¹¥¿¥Ã¥¯¤ò°ìÈÖ¾å¤Ë
´ð½à²½(¥¹¥±¡¼¥ë)¤·¤Æ³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥¹¥¿¥Ã¥¯¤ò¥Ý¥Ã¥× */
    fpsetmask(0);
    op = FPenv(OP) >> 16;
    switch (op & 0x7f8) {
    case 0x110:
    case 0x118:
    case 0x150:
    case 0x158:
    case 0x190:
    case 0x198:
        fscl = scalbnf(1.0f, (sip->si_code == FPE_FLTOVF)?
            -96 : 96);
        *(float *)FPenv(EA) = (FPreg(0) * fscl) * fscl;


 
        if (op & 8) {
            /* ¥¹¥¿¥Ã¥¯¤ò¥Ý¥Ã¥×¤¹¤ë */
            FPreg(0) = FPreg(1);
            FPreg(1) = FPreg(2);
            FPreg(2) = FPreg(3);
            FPreg(3) = FPreg(4);
            FPreg(4) = FPreg(5);
            FPreg(5) = FPreg(6);
            FPreg(6) = FPreg(7);
            top = (FPenv(SW) >> 10) & 0xe;
            FPenv(TW) |= (3 << top);
            top = (top + 2) & 0xe;
            FPenv(SW) = (FPenv(SW) & ~0x3800) | (top << 10);
        }
        break;

    case 0x510:
    case 0x518:
    case 0x550:
    case 0x558:
    case 0x590:
    case 0x598:
        dscl = scalbn(1.0, (sip->si_code == FPE_FLTOVF)?
            -768 : 768);
        *(double *)FPenv(EA) = (FPreg(0) * dscl) * dscl;
        if (op & 8) {
            /* ¥¹¥¿¥Ã¥¯¤ò¥Ý¥Ã¥×¤¹¤ë */
            FPreg(0) = FPreg(1);
            FPreg(1) = FPreg(2);
            FPreg(2) = FPreg(3);
            FPreg(3) = FPreg(4);
            FPreg(4) = FPreg(5);
            FPreg(5) = FPreg(6);
            FPreg(6) = FPreg(7);
            top = (FPenv(SW) >> 10) & 0xe;
            FPenv(TW) |= (3 << top);
            top = (top + 2) & 0xe;
            FPenv(SW) = (FPenv(SW) & ~0x3800) | (top << 10);
        }
        break;
    }
}


 
int
main()
{
    volatile float    a, b;
    volatile double    x, y;

    ieee_handler("set", "underflow", ieee_trapped_default);
    ieee_handler("set", "overflow", ieee_trapped_default);

    a = b = 1.0e30f;
    a *= b;
    printf( "%g\n", a );
    a /= b;
    printf( "%g\n", a );
    a /= b;
    printf( "%g\n", a );

    x = y = 1.0e300;
    x *= y;
    printf( "%g\n", x );
    x /= y;
    printf( "%g\n", x );
    x /= y;
    printf( "%g\n", x );

    ieee_retrospective(stdout);
    return 0;
}


SPARC ¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¾åµ­¤Î¥×¥í¥°¥é¥à¤Î½ÐÎϤϼ¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

159.309
1.59309e-28
1
4.14884e+137
4.14884e-163
1
 Note: IEEE floating-point exception traps enabled:
    underflow;  overflow;
 See the Numerical Computation Guide, ieee_handler(3M)

 
[ÆüËܸìÌõ]
Ãí: °Ê²¼¤Î IEEE ÉâÆ°¾®¿ôÅÀÎã³°¤Î¥È¥é¥Ã¥×¤¬Í­¸ú¤Ç¤¹:
	¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼
¾ÜºÙ¤Ï¡¢¡Ø¿ôÃÍ·×»»¥¬¥¤¥É¡Ù¤Î ieee_handler(3M)¤Ë´Ø¤¹¤ëÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À
¤µ¤¤¡£

C ¤ª¤è¤Ó C++ ¥×¥í¥°¥é¥à¤Ç¤Ï¡¢libm9x.so ¤Ë´Þ¤Þ¤ì¤ë fex_set_handling ´Ø¿ô¤ò»ÈÍѤ·¤Æ¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ª¤è¤Ó¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ËÂФ¹¤ë FEX_CUSTOM ¥Ï¥ó¥É¥é¤ò¥¤¥ó¥¹¥È¡¼¥ë¤Ç¤­¤Þ¤¹¡£SPARC ¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¤³¤Î¤è¤¦¤Ê¥Ï¥ó¥É¥é¤Ë¶¡µë¤µ¤ì¤ë¾ðÊó¤Ë¤ÏÎã³°¤Î¸¶°ø¤Ç¤¢¤ë±é»»¤È¥ª¥Ú¥é¥ó¥É¤¬¾ï¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¾åµ­¤Ë¼¨¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥Ï¥ó¥É¥é¤Ï¡¢¤³¤Î¾ðÊó¤ò»ÈÍѤ·¤Æ IEEE ¤Î»Ø¿ô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤ò·×»»¤Ç¤­¤Þ¤¹¡£x86 ¤Ç¤Ï¡¢Îã³°¤ò°ú¤­µ¯¤³¤·¤¿±é»»¡¢¤ª¤è¤ÓĶ±ÛÌ¿Îá¤Î 1 ¤Ä¤¬Îã³°¤òȯÀ¸¤µ¤»¤ë»þÅÀ (info->op ¥Ñ¥é¥á¡¼¥¿¤¬ fex_other ¤ËÀßÄꤵ¤ì¤ë¤Ê¤É¡£ÀâÌÀ¤Ï fenv.h ¥Õ¥¡¥¤¥ë¤ò»²¾È) ¤ò¡¢Ä󶡤µ¤ì¤ë¾ðÊ󤬾ï¤Ë¼¨¤¹¤È¤Ï¤«¤®¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢x86 ¥Ï¡¼¥É¥¦¥§¥¢¤Ï»Ø¿ô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤ò¼«Æ°Åª¤ËÄ󶡤¹¤ë¤¿¤á¡¢Îã³°¤òȯÀ¸¤µ¤»¤Æ¤¤¤ëÌ¿Îá¤Î°¸À褬ÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢¥ª¥Ú¥é¥ó¥É¤Î 1 ¤Ä¤¬¾å½ñ¤­¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£

fex_set_handling µ¡Ç½¤ò»ÈÍѤ¹¤ë¤È¡¢FEX_CUSTOM ¥â¡¼¥É¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¥Ï¥ó¥É¥é¤Ï¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¹¤ë±é»»¤ò IEEE »Ø¿ô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤ËÍưפËÃÖ´¹¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤ÎÎã³°¤Î¤É¤Á¤é¤«¤¬¥È¥é¥Ã¥×¤µ¤ì¤ë¾ì¹ç¡¢»Ø¿ô¤¬¥é¥Ã¥×¤µ¤ì¤¿·ë²Ì¤òÇÛÉÛ¤¹¤ë¤³¤È¤ò¼¨¤¹¤¿¤á¡¢¥Ï¥ó¥É¥é¤Ï¼¡¤Î¤è¤¦¤Ë¥»¥Ã¥È¤Ç¤­¤Þ¤¹¡£

info->res.type = fex_nodata;

¼¡¤Ë¡¢¤³¤Î¤è¤¦¤Ê¥Ï¥ó¥É¥é¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£

#include <stdio.h>
#include <fenv.h>

 
void handler(int ex, fex_info_t *info) {
    info->res.type = fex_nodata;
}

 
int main()
{
    volatile float  a, b;
    volatile double x, y;

 
    fex_set_log(stderr);
    fex_set_handling(FEX_UNDERFLOW | FEX_OVERFLOW, FEX_CUSTOM,
        handler);
    a = b = 1.0e30f;
    a *= b; /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ; ŬÀڤʿôÃͤ˥é¥Ã¥×¤µ¤ì¤ë */

 
    printf("%g\n", a);
    a /= b;
    printf("%g\n", a);
    a /= b; /* ¥¢¥ó¥À¡¼¥Õ¥í¡¼ ; µÕÊý¸þ¤Ë¥é¥Ã¥×¤µ¤ì¤ë */
    printf("%g\n", a);

 
    x = y = 1.0e300;
    x *= y; /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ; ŬÀڤʿôÃͤ˥é¥Ã¥×¤µ¤ì¤ë */
    printf("%g\n", x);
    x /= y;

 
    printf("%g\n", x);
    x /= y; /* ¥¢¥ó¥À¡¼¥Õ¥í¡¼ ; µÕÊý¸þ¤Ë¥é¥Ã¥×¤µ¤ì¤ë */
    printf("%g\n", x);

 
    return 0;
}

¾åµ­¤Î¥×¥í¥°¥é¥à¤Î½ÐÎϤϡ¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

Floating point overflow at 0x00010924 main, handler: handler
  0x00010928 main
159.309
1.59309e-28
Floating point underflow at 0x00010994 main, handler: handler
  0x00010998 main
1
Floating point overflow at 0x000109e4 main, handler: handler
  0x000109e8 main
4.14884e+137
4.14884e-163
Floating point underflow at 0x00010a4c main, handler: handler
  0x00010a50 main
1


¥µ¥ó¡¦¥Þ¥¤¥¯¥í¥·¥¹¥Æ¥à¥º³ô¼°²ñ¼Ò
Copyright information. All rights reserved.
¥Û¡¼¥à   |   Ìܼ¡   |   Á°¥Ú¡¼¥¸¤Ø   |   ¼¡¥Ú¡¼¥¸¤Ø   |   º÷°ú