¿ôÃÍ·×»»¥¬¥¤¥É |
Âè 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 754 ¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ëÎã³°½èÍý¤Ë´Ø¤¹¤ë¥Ç¥Õ¥©¥ë¥È·ë²Ì¤ò»ÈÍѤ·¤Æ¡¢¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤ò³¹Ô¤·¤Þ¤¹¡£
- Îã³°¥È¥é¥Ã¥×¤¬Í¸ú¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢
SIGFPE
¥·¥°¥Ê¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥×¥í¥°¥é¥à¤ËSIGFPE
¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¤È¡¢¤½¤Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤ËÀ©¸æ¤¬°Ü¤ê¤Þ¤¹¡£¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥í¥°¥é¥à¤¬°Û¾ï½ªÎ»¤·¤Þ¤¹¡£IEEE ¤ÎÉâÆ°¾®¿ôÅÀÎã³°¤Ï¡¢Ìµ¸ú¤Ê±é»»¡¢¥¼¥í½ü»»¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡¢¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢¤ª¤è¤ÓÉÔÀµ³Î¤Î 5 ¼ïÎब¤¢¤ê¤Þ¤¹¡£ºÇ½é¤Î 3 ¤Ä (̵¸ú¤Ê±é»»¡¢¥¼¥í½ü»»¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼) ¤ÎÎã³°¤Ï¶¦Ä̤ÎÎã³°¤È¸Æ¤Ð¤ì¤Æ¤ª¤ê¡¢Ìµ»ë¤¹¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£
ieee_handler
(3m) ¤Ë¤Ï¶¦Ä̤ÎÎã³°¤À¤±¤ò¥È¥é¥Ã¥×¤¹¤ë´Êñ¤ÊÊýË¡¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£Â¾¤Î 2 ¤Ä¤ÎÎã³° (¥¢¥ó¥À¡¼¥Õ¥í¡¼¡¢ÉÔÀµ³Î) ¤Ï¤è¤êÉÑÈˤËȯÀ¸¤·¤Þ¤¹¡£¼ÂºÝ¡¢¤Û¤È¤ó¤É¤ÎÉâÆ°¾®¿ôÅÀ±é»»¤ËÉÔÀµ³ÎÎã³°¤òȯÀ¸¤·¤Æ¤ª¤ê¡¢¤Û¤È¤ó¤É¤Î¾ì¹ç¤Ï̵»ë¤Ç¤¤Þ¤¹¡£É½ 4-1 ¤Ï IEEE ɸ½àµ¬³Ê 754 ¤ÎÆâÍƤòÍ×Ìó¤·¤¿¤â¤Î¤Ç¤¹¡£5 ¼ïÎà¤ÎÉâÆ°¾®¿ôÅÀÎã³°¤ª¤è¤ÓÎ㳰ȯÀ¸»þ¤Î IEEE ±é»»µ¡Ç½´Ä¶¤Î¥Ç¥Õ¥©¥ë¥È¤Î±þÅú¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£
ɽ 4-1 ¤ÎÃí
- Èó½ç½øÉÕ¤±Èæ³Ó:
Ǥ°Õ¤ÎÉâÆ°¾®¿ôÃͤÎÁȤϡ¢·Á¼°¤¬°Û¤Ê¤Ã¤Æ¤¤¤Æ¤âÈæ³Ó¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¼¡¤Î 4 ¤Ä¤ÎÁê¸ß¤ËÇÓ¾Ū¤ÊÈæ³Ó±é»» (¤è¤ê¾®¤µ¤¤¡¢¤è¤êÂ礤¤¡¢Åù¤·¤¤¡¢¤ª¤è¤ÓÈó½ç½øÉÕ¤±) ¤¬²Äǽ¤Ç¤¹¡£Èó½ç½øÉÕ¤±¤È¤Ï¡¢¥ª¥Ú¥é¥ó¥É¤Î¤¦¤Á¾¯¤Ê¤¯¤È¤â 1 ¤Ä¤¬ NaN (Èó¿ô) ¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
ɽ 4-2 Èó½ç½øÉÕ¤±Èæ³Ó = == .EQ.
̵¸ú ¡â != .NE.
̵¸ú > > .GT.
̵¸ú¤Ç¤Ï¤Ê¤¤ ¡æ >= .GE.
̵¸ú¤Ç¤Ï¤Ê¤¤ < < .LT.
̵¸ú¤Ç¤Ï¤Ê¤¤ ¡å <= .LE.
̵¸ú¤Ç¤Ï¤Ê¤¤
- ̵¸ú¤ÊÊÑ´¹:
NaN¡¢¤Þ¤¿¤Ï̵¸ÂÂ礫¤éÀ°¿ô¤ËÊÑ´¹¤·¤è¤¦¤È¤¹¤ë¤³¤È¡£¤Þ¤¿¤ÏÉâÆ°¾®¿ôÅÀ·Á¼°¤«¤é¤ÎÊÑ´¹»þ¤ËȯÀ¸¤·¤¿À°¿ôÃÍ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¡£- IEEE ¤ÎñÀºÅÙ¡¢ÇÜÀºÅÙ¡¢¤ª¤è¤Ó³ÈÄ¥ÇÜÀºÅ٤ηÁ¼°¤Çɽ¸½²Äǽ¤ÊºÇ¾®¤ÎÀµµ¬¿ô¤Ï¡¢¤½¤ì¤¾¤ì 2-126¡¢2-1022¡¢2-16382 ¤Ç¤¹¡£IEEE ¤ÎÉâÆ°¾®¿ôÅÀ·Á¼°¤Ë¤Ä¤¤¤Æ¤Ï¡¢Âè 2 ¾Ï¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
x86 ÉâÆ°¾®¿ôÅÀ´Ä¶¤Ë¤Ï¡¢IEEE µ¬³Ê¤Ë¤Ï¤Ê¤¤Îã³° (»Ø¿ô¤¬ºÇ¾®¤ÎÈóÀµµ¬¿ô¥ª¥Ú¥é¥ó¥ÉÎã³°) ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÎã³°¤Ï¡¢ÉâÆ°¾®¿ôÅÀ±é»»¤¬ÈóÀµµ¬¿ô¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤¿¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£
Îã³°¤ÎÍ¥Àè½ç°Ì¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£
ɽ 4-3 Îã³°¤ÎÍ¥Àè½ç°Ì ̵¸ú ̵¸ú ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ½ü»» ½ü»» ¥¢¥ó¥À¡¼¥Õ¥í¡¼ ¥¢¥ó¥À¡¼¥Õ¥í¡¼ ÉÔÀµ³Î ÉÔÀµ³Î ÈóÀµµ¬¿ô
Ʊ»þ¤ËȯÀ¸¤¹¤ë²ÄǽÀ¤Î¤¢¤ëɸ½àŪ¤ÊÎã³°¤Ï¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ÈÉÔÀµ³Î¡¢¤ª¤è¤Ó¥¢¥ó¥À¡¼¥Õ¥í¡¼¤ÈÉÔÀµ³Î¤À¤±¤Ç¤¹¡£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 outcall ieee_flags('clear', 'exception', 'overflow', out)C ¤Þ¤¿¤Ï C++ ¤Ç¤Ï¡¢Îã³°¤¬È¯À¸¤·¤¿¤«¤É¤¦¤«¤ÎÌ䤤¹ç¤ï¤»¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£
i = ieee_flags("get", "exception", in, out);½èÍý¤¬ÆÃÄê¤Ç¤¤¿¾ì¹ç¤Ë½ÐÎϥѥé¥á¡¼¥¿ out ¤ËÊÖ¤µ¤ì¤ëʸ»úÎó¤Ï¡¢°Ê²¼¤ÎÄ̤ê¤Ç¤¹¡£
not available
¡½ Îã³°¤Ë´Ø¤¹¤ë¾ðÊ󤬼èÆÀ¤Ç¤¤Þ¤»¤ó¡£- " " (¶õÇò¤Îʸ»úÎó) ¡½ ÎßÀÑÎã³°¤¬°ìÅÙ¤âȯÀ¸¤·¤Æ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¤Ï x86 ¤Î¾ì¹ç¡¢ÈóÀµµ¬¥ª¥Ú¥é¥ó¥É¤¬Í£°ì¤ÎÎßÀÑÎã³°¤Ç¤¹¡£
- Îã³°¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï¡¢3 ÈÖÌܤΰú¿ô in ¤Ë»ØÄꤵ¤ì¤Æ¤¤¤ëÎã³°¤Î̾Á°¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£
- ¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢ºÇ¤â¹â¤¤Í¥Àè½ç°Ì¤ò»ý¤ÄÎã³°¤Î̾Á°¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£in ¤¬Â¾¤Îʸ»úÎó¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢ºÇ¤â¹â¤¤Í¥Àè½ç°Ì¤ò»ý¤ÄÎßÀÑÎã³°¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£
FORTRAN ¸Æ¤Ó½Ð¤·¤Ë¤ª¤±¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£
character*8 outi = 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
¥Õ¥¡¥¤¥ë¤Ï¡¢¤½¤ì¤¾¤ì¤ÎÎã³°¤ËÂбþ¤¹¤ë¥Ó¥Ã¥È°ÌÃÖ¤òÄêµÁ¤·¤Þ¤¹¡£¤³¤Î¥Ó¥Ã¥È°ÌÃ֤ϥޥ·¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¡¢Ï¢Â³ (ÎÙÀÜ) ¤·¤Æ¤¤¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
²¼µ¤Î C ¤Þ¤¿¤Ï C++ ¤Î¥×¥í¥°¥é¥à¤Î°ìÉô¤Ï¡¢
i
¤ÎÃͤò¥Ç¥³¡¼¥É¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£
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 ¤Ä¤Î´Ø¿ô¤ò»ÈÍѤ·¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£
Îã³°¤ÎÆÃÄê
¥×¥í¥°¥é¥Þ¤¬Îã³°¤ò¹Íθ¤·¤Æ¥×¥í¥°¥é¥à¤òºîÀ®¤·¤Æ¤¤¤Ê¤¤¤¿¤á¤Ë¡¢Îã³°¤¬¸¡½Ð¤µ¤ì¤¿¤È¤¤Ë¡¢¤É¤³¤ÇÎã³°¤¬È¯À¸¤·¤¿¤Î¤«¤¬ÌäÂê¤Ë¤Ê¤ë¤³¤È¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£Îã³°¤¬È¯À¸¤·¤¿¾ì½ê¤òÆÃÄꤹ¤ëÊýË¡¤Î 1 ¤Ä¤Ï¡¢¥×¥í¥°¥é¥àÃæ¤Î¤µ¤Þ¤¶¤Þ¤Ê²Õ½ê¤ÇÎã³°¥Õ¥é¥°¤ò¥Æ¥¹¥È¤¹¤ë¤³¤È¤Ç¤¹¤¬¡¢¤³¤ÎÊýË¡¤ÇÀµ³Î¤ËÎã³°¤òÆÃÄꤹ¤ë¤Ë¤Ï¡¢Â¿¤¯¤Î¥Æ¥¹¥È¤ÈÏ«ÎϤ¬É¬Íפˤʤê¤Þ¤¹¡£
Îã³°¤ÎȯÀ¸¤·¤¿¾ì½ê¤òÆÃÄꤹ¤ë´Êñ¤ÊÊýË¡¤Ï¡¢Îã³°¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤³¤È¤Ç¤¹¡£¥È¥é¥Ã¥×¤¬Í¸ú¤Ç¡¢¤¢¤ëÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ï¡¢
SIGFPE
¥·¥°¥Ê¥ë¤òÁ÷¤Ã¤Æ¥×¥í¥°¥é¥à¤ËÄÌÃΤ·¤Þ¤¹ (¾ÜºÙ¤Ï¡¢signal
(5) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£Îã³°¤Î¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤È¡¢¥Ç¥Ð¥Ã¥¬¤Ç¼Â¹Ô¤·¤ÆSIGFPE
¥·¥°¥Ê¥ë¤ò¼õ¿®¤·¤¿»þÅÀ¤Ç¥×¥í¥°¥é¥à½ªÎ»¤¹¤ë¤«¡¢¤Þ¤¿¤ÏÎã³°¤¬È¯À¸¤·¤¿Ì¿Îá¤Î¥¢¥É¥ì¥¹¤ò½ÐÎϤ¹¤ë¤è¤¦¤ËSIGFPE
¥Ï¥ó¥É¥é¤òÀßÄꤷ¤Æ¡¢Îã³°¤ÎȯÀ¸²Õ½ê¤òÆÃÄꤹ¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£SIGFPE
¥·¥°¥Ê¥ë¤òÀ¸À®¤¹¤ëÎã³°¤Ë¤Ä¤¤¤Æ¤Ï¥È¥é¥Ã¥×¤ò͸ú¤Ë¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¥È¥é¥Ã¥×¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤ËÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢Âбþ¤¹¤ë¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¡¢¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤Ï ɽ 4-1 ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¥Ç¥Õ¥©¥ë¥È¤Î·ë²Ì¤Ç·Ñ³¤µ¤ì¤Æ¤Þ¤¹¤¬¡¢¥·¥°¥Ê¥ë¤ÏÁ÷¤é¤ì¤Þ¤»¤ó¡£¥Ç¥Ð¥Ã¥¬¤ò»ÈÍѤ·¤ÆÎã³°¤òÆÃÄꤹ¤ë
¤³¤ÎÀá¤Ç¤Ï¡¢
dbx
(¥½¡¼¥¹¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥¬) ¤Èadb
(¥¢¥»¥ó¥Ö¥ê¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥¬) ¤Î»ÈÍÑÎã¤ò»²¹Í¤Ë¤·¤Æ¡¢ÉâÆ°¾®¿ôÅÀÎã³°¤Î¸¶°ø¤È¡¢Î㳰ȯÀ¸¤µ¤»¤¿Ì¿Îá¤òÄ´¤Ù¤Þ¤¹¡£dbx
¤Ç¥½¡¼¥¹¥ì¥Ù¥ë¤Î¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤ò-g
¥ª¥×¥·¥ç¥óÉÕ¤¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¡Ødbx ¥³¥Þ¥ó¥É¤Ë¤è¤ë¥Ç¥Ð¥Ã¥°¡Ù¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
program exdouble precision x,y sqrtm1x = -4.2d0y = sqrtm1(x)print * , x, yenddouble precision function sqrtm1(x)double precision xroutine = sqrt(x) - 1.0d0returnend¤³¤Î¥×¥í¥°¥é¥à¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¼Â¹Ô¤¹¤ë¤È¡¢¼¡¤Î¤è¤¦¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
̵¸ú¤Ê±é»»¤Î¸¶°ø¤òÆͤ»ß¤á¤ë¤Ë¤Ï¡¢Ìµ¸ú¤Ê±é»»¤Ë¤Ä¤¤¤Æ¤Î¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤¿¤á¤Ë¡¢
-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
¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£·ë²Ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤Î½ÐÎÏÎã¤Ç¤Ï¡¢Éé¤Î¿ô¤ÎÊ¿Êýº¬¤òµá¤á¤è¤¦¤È¤·¤¿·ë²Ì¡¢
sqrtm1
´Ø¿ô¤ÇÎã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£
adb
¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤È¤Ê¤Ã¤Æ¤¤¤ëÌ¿Îá¤òÆÃÄꤹ¤ë
adb
¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤òÆÃÄꤹ¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£¤¿¤À¤·¡¢dbx
¤È¤Ï°Û¤Ê¤ê¡¢adb
¤Ç¤Ï¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ä¹ÔÈÖ¹æ¤ÏÆÃÄê¤Ç¤¤Þ¤»¤ó¡£adb
¤ò»ÈÍѤ¹¤ë¾ì¹ç¤â¡¢ºÇ½é¤Î¼ê½ç¤Ï-ftrap
¤ò»ØÄꤷ¤Æ¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£
example%f77 -ftrap=invalid ex.f
¼¡¤Ë
adb
¤òµ¯Æ°¤·¤Æ¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£Ìµ¸ú¤Ê±é»»Îã³°¤¬È¯À¸¤¹¤ë¤È¡¢adb
¤ÏÎã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤Î¼¡¤ÎÌ¿Îá¤ÇÄä»ß¤·¤Þ¤¹¡£Îã³°¤Î¸¶°ø¤Ç¤¢¤ëÌ¿Îá¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎÌ¿Îá¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¡¢adb
¤¬Ää»ß¤·¤¿Ì¿Îá¤è¤êÁ°¤Ë¤¢¤ëºÇ¸å¤ÎÉâÆ°¾®¿ôÅÀÌ¿Îá¤òõ¤·¤Þ¤¹¡£SPARC ¥¢¡¼¥¥Æ¥¯¥Á¥ã¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢·ë²Ì¤Ï¼¡¤ÎÎã¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤Î½ÐÎÏÎã¤Ï¡¢
fsqrtd
Ì¿Î᤬¸¶°ø¤ÇÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£¥½¡¼¥¹¥ì¥¸¥¹¥¿¤òÄ´¤Ù¤ë¤È¡¢Éé¤Î¿ô¤ÎÊ¿Êýº¬¤òµá¤á¤è¤¦¤È¤·¤¿¤¿¤á¤Ë¤³¤ÎÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£x86 ¤Ç¤Ï¡¢Ì¿Î᤬¸ÇÄêĹ¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢¥³¡¼¥É¤ÎµÕ¥¢¥»¥ó¥Ö¥ë¤ò³«»Ï¤¹¤ëÀµ¤·¤¤¥¢¥É¥ì¥¹¤ò¸«¤Ä¤±¤ë¤Ë¤Ï»î¹Ôºø¸í¤¬É¬Íפˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢´Ø¿ô¤ÎÀèƬÉÕ¶á¤ÇÎã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤³¤«¤éµÕ¥¢¥»¥ó¥Ö¥ë¤Ç¤¤Þ¤¹¡£°ìÈÌŪ¤Ê·ë²Ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤Î½ÐÎÏÎã¤Ï¡¢
fsqrt
Ì¿Î᤬¸¶°ø¤ÇÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤òÄ´¤Ù¤ë¤È¡¢Éé¤Î¿ô¤ÎÊ¿Êýº¬¤òµá¤á¤è¤¦¤È¤·¤¿¤¿¤á¤Ë¤³¤ÎÎã³°¤¬È¯À¸¤·¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£ºÆ¥³¥ó¥Ñ¥¤¥ë¤»¤º¤Ë¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë
¾åµ¤ÎÎã¤Ç¤Ï¡¢
-ftrap
¥Õ¥é¥°¤ò»ØÄꤷ¤Æ¡¢¼ç¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢Ìµ¸ú¤Ê±é»»¤ÎÎã³°¥È¥é¥Ã¥×¤ò͸ú¤Ë¤·¤Þ¤·¤¿¡£¼ç¥×¥í¥°¥é¥à¤ÎºÆ¥³¥ó¥Ñ¥¤¥ë¤¬ÉÔ²Äǽ¤Ê¾ì¹ç¤¬¤¢¤ê¡¢Â¾¤ÎÊýË¡¤Ç¥È¥é¥Ã¥×¤ò͸ú¤Ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤Ë¤Ï¤¤¤¯¤Ä¤«¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£
dbx
¤Î»ÈÍÑÃæ¤Ë¡¢ÉâÆ°¾®¿ôÅÀ¾õÂ֥쥸¥¹¥¿¤òľÀÜÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£SPARC ¤Ç¤Ï¡¢¤³¤ÎÊýË¡¤Ë¤ÏÃí°Õ¤¬É¬ÍפǤ¹¡£¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¥×¥í¥°¥é¥àÆâ¤ÇºÇ½é¤Ë»ÈÍѤµ¤ì¤ë¤Þ¤ÇÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤Ï»ÈÍѲÄǽ¤Ë¤Ê¤ê¤Þ¤»¤ó¡£ÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤¬ºÇ½é¤Ë»ÈÍѤµ¤ì¤¿»þÅÀ¤Ç¡¢ÉâÆ°¾®¿ôÅÀ¾õÂ֥쥸¥¹¥¿¤Ï¥ê¥»¥Ã¥È¤µ¤ì¡¢¤¹¤Ù¤Æ¤Î¥È¥é¥Ã¥×¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥×¥í¥°¥é¥à¤¬¾¯¤Ê¤¯¤È¤â 1 ¤Ä¤ÎÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò¼Â¹Ô¤¹¤ë¤Þ¤Ç¤Ï¼êÆ°¤Ç¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£¤³¤³¤Ç¼¨¤·¤¿Îã¤Ç¤Ï¡¢
sqrtm1
´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤Þ¤Ç¤ËÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤Ï¥¢¥¯¥»¥¹¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤Î´Ø¿ô¤Ø¤ÎÆþ¸ý¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¡¢Ìµ¸ú¤Ê±é»»¤ËÂФ¹¤ëÎã³°¥È¥é¥Ã¥×¤ò͸ú¤Ë¤·¡¢SIGFPE
¥·¥°¥Ê¥ë¤Î¼õ¿®»þ¤Ëdbx
¤òÄä»ß¤¹¤ë¤è¤¦ÀßÄꤷ¤Æ¡¢¼Â¹Ô¤ò·Ñ³¤Ç¤¤Þ¤¹¡£¥¢¡¼¥¥Æ¥¯¥Á¥ã¤Î¥·¥¹¥Æ¥à¤Ç¤Î¼ê½ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£Ìµ¸ú¤Ê±é»»Îã³°¤ËÂФ¹¤ë¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤¿¤á¤Ë¡¢assign
¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ%fsr
¤òÊѹ¹¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
x86 ¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤¬³Æ¥×¥í¥°¥é¥àÆâ¤Ë¼«Æ°Åª¤Ë¥ê¥ó¥¯¤¹¤ëµ¯Æ°¥³¡¼¥É¤Ï¡¢À©¸æ¤ò¥á¥¤¥ó¥×¥í¥°¥é¥à¤Ë°ú¤ÅϤ¹Á°¤ËÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤ò½é´ü²½¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¥á¥¤¥ó¥×¥í¥°¥é¥à¤¬³«»Ï¤·¤¿¸å¤Ç¡¢¤¤¤Ä¤Ç¤â¼êÆ°¤Ç¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤³¤È¤Ç¤¤Þ¤¹¡£¼¡¤Ë¡¢¤³¤Î½èÍý¤Î¥¹¥Æ¥Ã¥×Îã¤ò¼¨¤·¤Þ¤¹¡£
¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë½é´ü²½¥ë¡¼¥Á¥ó¤òºîÀ®¤¹¤ë¤È¡¢¥á¥¤¥ó¥×¥í¥°¥é¥à¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤¿¤ê
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 address8048afd.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
¥ë¡¼¥Á¥ó¤Ï¡¢É¸½à¤Î¥ë¡¼¥Á¥ó¤¬¹Ô¤¦½é´ü²½µ¡Ç½¤Î»Ä¤ê¤ò¼Â¹Ô¤·¤Þ¤¹¡£¼¡¤Ë¡¢¤³¤Î½èÍý¤ò¹Ô¤¦¥³¡¼¥ÉÎã¤ò¼¨¤·¤Þ¤¹¡£
¤³¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ò¶¦Í¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¥×¥ê¥í¡¼¥É¤¹¤ë¤È¡¢´üÂÔ¤µ¤ì¤ë·ë²Ì¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
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
) Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ÆþÎϥѥé¥á¡¼¥¿¤Î¼è¤êÆÀ¤ëÃͤϡ¢°Ê²¼¤ÎÄ̤ê¤Ç¤¹¡£
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 ¤Î¥³¡¼¥É¤Ç¤Ï¡¢¥¼¥í¤Ë¤è¤ë½ü»»¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï¥×¥í¥°¥é¥à¤ò½ªÎ»¤·¤Þ¤¹¡£
FORTRAN ¤Î¾ì¹ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¼¡¤Î 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 »»½ÑÎã³°¤Î·¿ 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 ¤Ç¡¢¤³¤Î¤è¤¦¤Ê¥Ï¥ó¥É¥é¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£
SPARC ¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¤³¤Î¥×¥í¥°¥é¥à¤«¤é¤Î½ÐÎϤϼ¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
min_normal = 2.22507e-308min_normal / 13.0 = 1.7116e-309max_normal = 1.79769e+308fp exception 4 at address 10d0cmax_normal * max_normal = 1.79769e+308Note: 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-308min_normal / 13.0 = 1.7116e-309max_normal = 1.79769e+308fp exception 4 at address 8048fe6max_normal * max_normal = 1.79769e+308Note: 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 ¤Ä¤Î¥â¡¼¥É¤ò¼¨¤·¤Þ¤¹¡£
FEX_NONSTOP
¥â¡¼¥É¤Ï¡¢IEEE 754 ¤Î¥Ç¥Õ¥©¥ë¥È¤ÎϢ³ưºî¤òÄ󶡤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢Îã³°¤Î¥È¥é¥Ã¥×¤ò̵¸ú¤Ë¤·¤Æ¤ª¤¯¤Î¤ÈƱ¤¸¤Ç¤¹¡£ieee_handler
¤È°Û¤Ê¤ê¡¢fex_set_handling
¤Ç¤Ï¡¢Ìµ¸ú±é»»Îã³°¤Î°ìÄê¤Î¼ïÎà¤ËÂФ·¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î½èÍý¤ò³ÎΩ¤·¡¢»Ä¤ë¼ïÎà¤Ë IEEE ¤Î¥Ç¥Õ¥©¥ë¥È½èÍý¤òÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£FEX_NOHANDLER
¥â¡¼¥É¤Ï¡¢¥Ï¥ó¥É¥é¤òÄ󶡤»¤º¤ËÎã³°¤Î¥È¥é¥Ã¥×¤ò͸ú¤Ë¤¹¤ë¤Î¤ÈƱ¤¸¤Ç¤¹¡£Îã³°¤¬È¯À¸¤¹¤ë¤È¡¢¥·¥¹¥Æ¥à¤Ï¡¢Á°²ó¥¤¥ó¥¹¥È¡¼¥ë¤·¤¿SIGFPE
¥Ï¥ó¥É¥é¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï¤³¤Î¥Ï¥ó¥É¥é¤ËÀ©¸æ¤òÅϤ·¡¢Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï½èÍý¤òÃæ»ß¤·¤Þ¤¹¡£FEX_ABORT
¥â¡¼¥É¤Ç¤Ï¡¢Îã³°¤¬È¯À¸¤¹¤ë¤È¥×¥í¥°¥é¥à¤Ïabort
(3c) ¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£FEX_SIGNAL
¤Ï¡¢¼¨¤µ¤ì¤¿Îã³°¤ËÂФ·¡¢°ú¿ô handler ¤Ç»ØÄꤵ¤ì¤¿½èÍý´Ø¿ô¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤³¤ì¤é¤ÎÎã³°¤Î¤É¤ì¤«¤¬È¯À¸¤¹¤ë¤È¡¢ieee_handler
¤Ë¤è¤Ã¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ë¡¢Æ±¤¸°ú¿ô¤Ë¤è¤Ã¤Æ¥Ï¥ó¥É¥é¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£FEX_CUSTOM
¤Ï¡¢¼¨¤µ¤ì¤¿Îã³°¤ËÂФ·¡¢handler ¤Ç»ØÄꤵ¤ì¤¿½èÍý´Ø¿ô¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£FEX_SIGNAL
¥â¡¼¥É¤È°Û¤Ê¤ê¡¢Îã³°¤¬È¯À¸¤¹¤ë¤È¡¢´Êά²½¤µ¤ì¤¿°ú¿ô¥ê¥¹¥È¤Ë¤è¤Ã¤Æ¥Ï¥ó¥É¥é¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î°ú¿ô¤Ï¡¢À°¿ô (ÃͤÏɽ 4-6 ¤Ë¼¨¤µ¤ì¤¿ÃͤΠ1 ¤Ä) ¤È¡¢Îã³°¤Î¸¶°ø¤È¤Ê¤Ã¤¿±é»»¤Ë¤Ä¤¤¤Æ¤ÎÄɲþðÊó¤òµÏ¿¤¹¤ë¹½Â¤ÂΤò»Ø¤¹¥Ý¥¤¥ó¥¿¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤÎÆâÍƤϡ¢¼¡¤ÎÀá¤Èfex_set_handling
(3m) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£»ØÄꤵ¤ì¤¿ 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
¥â¡¼¥É¤¬Í¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤½¤Î¥Õ¥é¥°¤¬Ä¾Á°¤ËȯÀ¸¤·¤¿¡£¶ñÂÎŪ¤Ë¤Ï¡¢¤Û¤È¤ó¤É¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¢Îã³°¤Î¤½¤ì¤¾¤ì¤Î¼ïÎबºÇ½é¤ËȯÀ¸¤¹¤ë¾ì¹ç¤À¤±¥í¥°¤ËµÏ¿¤µ¤ì¤Þ¤¹¡£¤¢¤ëÎã³°¤ËÂФ·¤Æ
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_, abort0x00010c30 sqrtm1_0x00010b48 MAIN_0x00010ccc mainAbort¤³¤Î½ÐÎϤϡ¢¥ë¡¼¥Á¥ó
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.3091.59309e-2814.14884e+1374.14884e-1631Note: 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.3091.59309e-2814.14884e+1374.14884e-1631Note: 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: handler0x00010928 main159.3091.59309e-28Floating point underflow at 0x00010994 main, handler: handler0x00010998 main1Floating point overflow at 0x000109e4 main, handler: handler0x000109e8 main4.14884e+1374.14884e-163Floating point underflow at 0x00010a4c main, handler: handler0x00010a50 main1
¥µ¥ó¡¦¥Þ¥¤¥¯¥í¥·¥¹¥Æ¥à¥º³ô¼°²ñ¼Ò Copyright information. All rights reserved. |
¥Û¡¼¥à | Ìܼ¡ | Á°¥Ú¡¼¥¸¤Ø | ¼¡¥Ú¡¼¥¸¤Ø | º÷°ú |