é ãæ代ãITæ¥çã«ãšã£ãŠã¯ãããã¯åäžçŽã®70幎代ã§ãæ°åŠè ïŒããã°ã©ããŒã¯ä»¥ååŒã°ããŠããŸããïŒã¯ãã³ãããŒãã®ããã«ãåœæã®å°ããªé¢šè»ã®ãµã€ãºã®ã³ã³ãã¥ãŒã¿ãŒãšã®äžå¹³çãªæŠãã§æŠããŸããã æ·±å»ãªã¿ã¹ã¯ãèšå®ãããŸããïŒè»éããã®ç»åããã®æµ·æŽã®æµã®æœæ°ŽèŠã®æ€çŽ¢ãé·è·é¢ããµã€ã«ã®åŒŸéã®èšç®ãªã©ã ãããã解決ããããã«ãã³ã³ãã¥ãŒã¿ãŒã¯å®æ°ã§åäœããå¿ èŠããããŸããå®æ°ã¯ããåãã®ããã«é£ç¶äœã§ãããã¡ã¢ãªã¯æéã§ãã ãããã£ãŠããã®é£ç¶äœããŒããš1ã®æéã»ããã«ãããã³ã°ããå¿ èŠããããŸãã é床ããµã€ãºã粟床ã®åŠ¥åç¹ãæ±ããŠãç§åŠè ã¯æµ®åå°æ°ç¹æ°ïŒãŸãã¯ãã«ãžã§ã¢ãªãæµ®åå°æ°ç¹ïŒãææ¡ããŸããã
äœããã®çç±ã§ã察å¿ããããŒã¿åããã¹ãŠã®ããã°ã©ãã³ã°èšèªã«ååšããããšãèãããšãæµ®åå°æ°ç¹æŒç®ã¯ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®ãšããŸããã¯ãªåéãšèŠãªãããŸãã æ£çŽã«èšããšãCPUãšGPUã§åãåé¡ã解決ããªãããç§èªèº«ã¯ã³ã³ãã¥ãŒã¿ãŒæŒç®ãããã»ã©éèŠããŠããŸããã§ããããçµæã¯ç°ãªããŸãã ãã®é åã®é ãããã³ãŒããŒã«ã¯ãéåžžã«å¥åŠã§å¥åŠãªçŸè±¡ããããŸããéå¯ææ§ããã³éé£æ³æ§ã®ç®è¡æŒç®ã笊å·ä»ããŒããäžçå·ã®å·®ããŒããªã©ã§ãã ãã®æ°·å±±ã®æ ¹ã¯æ°åŠã«æ·±ãå ¥ã蟌ãã§ãããåãå£ã®äžã§ã¯è¡šé¢ã«ãããã®ã ããæŠèª¬ããããšããŸãã
1.åºæ¬
æŽæ°ã®ã»ããã¯ç¡éã§ãããç¹å®ã®åé¡ã解決ãããšãã«çããæŽæ°ãè¡šãããã«ããã®ãããªãããæ°ããã€ã§ãååŸã§ããŸãã å®æ°ã®ã»ããã¯ç¡éã§ããã ãã§ãªãé£ç¶çã§ããããããããããããåãã«ããŠããæ£ç¢ºãªè¡šçŸãæããªãæ°åã«ééããããšã¯é¿ããããŸããã æµ®åå°æ°ç¹æ°ã¯ãå®æ°ã衚瀺ããæ¹æ³ã®1ã€ã§ããããã¯ã粟床ãšèš±å®¹å€ã®ç¯å²ã®éã®åŠ¥åç¹ã§ãã
æµ®åå°æ°ç¹æ°ã¯ãéåžžã笊å·ã
æ°åŠçã«ã¯ã次ã®ããã«æžãããŠããŸãã
ïŒ-1ïŒ s ÃMÃB E ãããã§sã¯ç¬Šå·ãB-baseãEã¯æ¬¡æ°ãMã¯ä»®æ°ã§ãã
åºæ°ã¯ãæ°åã®æ°äœç³»ã決å®ããŸãã åºæ°B = 2ã®æµ®åå°æ°ç¹æ°ïŒ2é²è¡šçŸïŒãäžžã誀差ã«æãèæ§ãããããšãæ°åŠçã«èšŒæãããŠãããããå®éã«ã¯ãåºæ°2ãšãããŸãäžè¬çã§ã¯ãªã10ã®ã¿ãçºçããŸããæµ®åå°æ°ç¹ã¯æ¬¡ã®ããã«ãªããŸãã
ïŒ-1ïŒ s ÃMÃ2 E
ä»®æ°ãšé åºãšã¯äœã§ããïŒ ä»®æ°ã¯ãå®æ°ã®æäžäœããããè¡šãåºå®é·ã®æŽæ°ã§ãã ä»®æ°ã3ãããïŒ| M | = 3ïŒã§æ§æãããŠãããšããŸãã ããšãã°ããã€ããªã·ã¹ãã ã§ã¯101 2ã«çããæ°å€ã5ãã䜿çšããŸãã æäžäœãããã¯2 2 = 4ã«å¯Ÿå¿ããäžå€®ïŒããã¯ãŒãã§ãïŒã¯2 1 = 2ã§ãæäžäœãããã¯2 0 = 1ã§ãã é åºã¯ãæé«ã©ã³ã¯ã®ããŒã¹ïŒ2ïŒã®æ¬¡æ°ã§ãã ãã®äŸã§ã¯ãE = 2ã§ãã ãã®ãããªæ°å€ã¯ãããšãã°ã1.01e + 2ããªã©ããããã
ä»®æ°ã®åã3ãããã䜿çšããŠå°æ°ãååŸãããšããŸãã ããšãã°ãE = 1ã®å Žåããããè¡ãããšãã§ããŸãã ãã®åŸãç§ãã¡ã®æ°ã¯çãããªããŸã
1.01e + 1 = 1Ã2 1 + 0Ã2 0 + 1Ã2 -1 = 2 + 0.5 = 2.5
ããã§ã¯ãE = 1ãªã®ã§ãæåã®æ¡ã®2ã®ã¹ãä¹ïŒå°æ°ç¹ã®åã«æ¥ãïŒã¯ã1ãã§ãã å³åŽïŒå°æ°ç¹ä»¥äžïŒã«ããä»ã®2ã€ã®æŸé»ã¯ã2 E-1ãš2 E-2 ïŒãããã2 0ãš2 -1 ïŒã®å¯äžãæäŸããŸãã æããã«ãEã調æŽããããšã«ãããåãæ°ãç°ãªãæ¹æ³ã§è¡šãããšãã§ããŸãã ä»®æ°ã®é·ã| M | = 4ã®äŸãèããŠã¿ãŸãããã çªå·ã2ãã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã
2 = 10ïŒãã€ããªïŒ= 1.000e + 1 = 0.100e + 2 = 0.010e + 3ã ïŒE = 1ãE = 2ãE = 3ïŒ
åãçªå·ã«ã¯è€æ°ã®è¡šçŸãããããšã«æ³šæããŠãã ããã ããã¯ãæ©åšã«ãšã£ãŠã¯äŸ¿å©ã§ã¯ãããŸããã æ°å€ãæ¯èŒãããšããããã³ãããã«å¯ŸããŠç®è¡æŒç®ãå®è¡ãããšãã¯ãè¡šçŸã®å€æ§æ§ãèæ ®ããå¿ èŠããããŸãã ããã«ãããã¯ãè¡šçŸã®æ°ãæéã§ãããç¹°ãè¿ãã¯ãŸã£ããè¡šçŸã§ããæ°ã®æ°ãæžãããããçµæžçã§ã¯ãããŸããã ãããã£ãŠããã§ã«éåžžã«æåã®ãã·ã³ã§ã圌ãã¯ããªãã¯ã䜿çšãå§ããä»®æ°éšã®æåã®ããããåžžã«æ£ã«ããŸããã ãã®ãããªãã¬ãŒã³ããŒã·ã§ã³ã¯ã normalizedãšåŒã°ããŠããŸãã ã
æé»çãªãŠããããã¡ã¢ãªã«ä¿åããå¿ èŠããªããããããã«ãã1ããããç¯çŽãããæ°å€ã®äžæã®è¡šçŸãæäŸãããŸãã ãã®äŸã§ã¯ãã2ãã«ã¯åäžã®æ£èŠåè¡šçŸïŒã1.000e + 1ãïŒããããä»®æ°ã¯ã000ããšããŠã¡ã¢ãªã«ä¿åãããŸãã äžäœãŠãããã¯æé»çã«æ瀺ãããŸãã ããããæ°å€ã®æ£èŠåãããè¡šçŸã§ã¯ãæ°ããåé¡ãçºçããŸã-ãã®åœ¢åŒã§ãŒããè¡šçŸããããšã¯äžå¯èœã§ãã
å³å¯ã«èšãã°ãæ£èŠåãããæ°å€ã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
ïŒ-1ïŒ s Ã1.MÃ2 E.
åé¡è§£æ±ºã®è³ªã¯ãæµ®åå°æ°ç¹æ°ã®è¡šçŸã®éžæã«å€§ããäŸåããŸãã ãã®ãããªãã¥ãŒãæšæºåããåé¡ã«ã¹ã ãŒãºã«åãçµã¿ãŸããã
2.å°ãã®æŽå²
60幎代ããã³70幎代ã«ã¯ãæµ®åå°æ°ç¹æ°ãäžžãæ¹æ³ãããã³ç®è¡æŒç®ãè¡šãåäžã®æšæºããããŸããã§ããã ãã®çµæãããã°ã©ã ã¯éåžžã«ããŒã¿ãã«ã§ã¯ãããŸããã§ããã ããããããã«å€§ããªåé¡ã¯ãããŸããŸãªã³ã³ãã¥ãŒã¿ãŒã«ãå¥åŠãªãèŠçŽ ããããããã°ã©ã ã§ããããèªèããŠèæ ®ããå¿ èŠãããããšã§ããã ããšãã°ã2ã€ã®ç°ãªãæ°å€ã®å·®ã¯ãŒããè¿ããŸããã ãã®çµæãåŒãX = YããšãXY = 0ãã競åããŸããã è·äººã¯ãåé¡ãé¿ããããã«ä¹ç®ãšé€ç®ã®æäœã®åã«å²ãåœãŠãX =ïŒXXïŒ+ Xããè¡ããªã©ãéåžžã«ããªãããŒãªããªãã¯ã§ãã®åé¡ãåé¿ããŸããã
æµ®åå°æ°ç¹æ°ã®è¡šçŸã®ããã®åäžã®æšæºãäœæãããšããã€ãã·ã¢ããã¯ã1976幎ã«Intelã8086ããã³i432ã®æ°ããã³ããã»ããµçšã®ãæé©ãªãç®è¡æŒç®ãéçºããããšããè©Šã¿ãšäžèŽããŸããã ãã®åéã®ç§åŠã¯ãžã©ãææã ãžã§ã³ã»ããŒããŒãšãŠã£ãªã¢ã ã»ã«ãŒãã³ã åŸè ã¯åœŒã®ã€ã³ã¿ãã¥ãŒã§ãIntelãç®è¡æŒç®ãéçºããŠããçå£ãã«ãããä»ã®äŒæ¥ãå£çµããŠæšæºåããã»ã¹ãéå§ããããšãäœåãªããããšè¿°ã¹ãŸããã
誰ããçå£ã§ããããªããªããããªãã®ã¢ãŒããã¯ãã£ãä¿é²ãããããæšæºã«ããããšã¯éåžžã«æçã ããã§ãã 圌ãã®ææ¡ã¯ãã¢ãããŒã©ã®Zilogã®National Superconductorã®DECã«ãã£ãŠæ瀺ãããŸããã ã¡ã€ã³ãã¬ãŒã ã®ã¡ãŒã«ãŒã§ããCrayãšIBMã¯ãå芳è ã®ç®ããèŠãŠããã Intelã¯ãã¡ãããæ°ããç®è¡æŒç®ãå°å ¥ããŸããã ææ¡ãããä»æ§ã®äœæè ã¯ãWilliam KahanãJerome KunenãHarold Stoneã§ããã圌ãã®ææ¡ã¯ããã«ãKCSããšåŒã°ããŸããã
ããã«ãDECã®VAXãšIntelã®ãKCSãã®2ã€ãé€ããŠããã¹ãŠã®ãªãã¡ãŒãæåŠãããŸããã VAXä»æ§ã¯ã¯ããã«åçŽã§ãPDP-11ã³ã³ãã¥ãŒã¿ãŒã«æ¢ã«å®è£ ãããŠããããã®ããã©ãŒãã³ã¹ãæ倧éã«åŒãåºãæ¹æ³ãæ確ã§ããã äžæ¹ãKCSã«ã¯ããç¹å¥ãªãæ°åããéæ£èŠåããããæ°åãªã©ãå€ãã®äŸ¿å©ãªæ©èœãå«ãŸããŠããŸããïŒè©³çŽ°ã¯ä»¥äžïŒã
ãKCSãã§ã¯ããã¹ãŠã®ç®è¡ã¢ã«ãŽãªãºã ãå³å¯ã«å®çŸ©ãããŠãããå®è£ ã§ã¯çµæããããã«äžèŽããå¿ èŠããããŸãã ããã«ããããã®ä»æ§ã®ãã¬ãŒã ã¯ãŒã¯å ã§å³å¯ãªèšç®ã衚瀺ã§ããŸãã æ°åŠè ãæ°å€çæ¹æ³ã§åé¡ã解決ããããã«äœ¿çšãã解ã®ç¹æ§ã蚌æããå Žåããããã®ç¹æ§ãããã°ã©ã ã«ä¿åããããšããä¿èšŒã¯ãããŸããã§ããã KCSæŒç®ã®å³å¯ãã«ãããæµ®åå°æ°ç¹æŒç®ã«åºã¥ããå®çã蚌æããããšãã§ããŸããã
DECã¯ãä»æ§ãæšæºã«ããããã«ããããããšãè¡ã£ãŠããŸãã 圌女ã¯ãKCSç®è¡æŒç®ãååãšããŠDECãšåãããã©ãŒãã³ã¹ãéæã§ããªãã£ããšããè©å€ã®é«ãç§åŠè ã®æ¯æãæ±ããŸããã ç®èãªããšã«ãIntelã¯ä»æ§ãçç£çã«ããæ¹æ³ãç¥ã£ãŠããŸãããããããã®ããªãã¯ã¯äŒæ¥ç§å¯ã§ããã Intelãç§å¯ãèªãããç§å¯ã®äžéšãæããã«ããªãã£ãå ŽåãDECã®çæ»æãå°ã蟌ããããšã¯ã§ããªãã£ãã§ãããã
æšæºåã®æŠãã®è©³çŽ°ã«ã€ããŠã¯ã Kahanææã®ã€ã³ã¿ãã¥ãŒãåç §ããŠãã ãããæµ®åå°æ°ç¹æ°ã®è¡šçŸãã©ã®ããã«èŠããããèŠãŠãããŸãã
3.ä»æ¥ã®æµ®åå°æ°ç¹æ°ã®ãã¬ãŒã³ããŒã·ã§ã³
KCSéçºè ãåã¡ãçŸåšããã®åå«ã¯IEEE754æšæºã«çµã¿èŸŒãŸããŠããŸãã ãã®äžã®æµ®åå°æ°ç¹æ°ã¯ã次ã®ããã«ç¬Šå·ïŒsïŒãä»®æ°ïŒMïŒãããã³é åºïŒEïŒã®åœ¢åŒã§è¡šç€ºãããŸãã
ïŒ-1ïŒ s Ã1.MÃ2 E
çºèšã æ°ããIEE754-2008æšæºã§ã¯ã2ãåºãšããæ°å€ã«å ããŠã10ãåºãšããæ°å€ããããã10é²æµ®åå°æ°ç¹æ°ããããŸãã
Wikipediaã§èŠã€ããããéå°ãªæ å ±ã§èªè ãæ··ä¹±ãããªãããã«ãå粟床ïŒæµ®åïŒã®1ã€ã®ããŒã¿åã®ã¿ãèæ ®ããŸãã å粟床ãå粟床ãæ¡åŒµç²ŸåºŠã®æ°å€ã¯åãæ©èœãæã¡ãŸãããé åºãšä»®æ°ã®ç¯å²ãç°ãªããŸãã å粟床æ°ïŒæµ®å/å粟床ïŒã§ã¯ãé åºã¯8ãããã§æ§æãããä»®æ°ã¯23ã§ããæå¹ãªé åºã¯E-127ãšããŠå®çŸ©ãããŸãã ããšãã°ã0.15625ãšããæ°å€ã¯ã¡ã¢ãªã«æ¬¡ã®ããã«æžã蟌ãŸããŸãã
ãŠã£ãããã£ã¢ããã®å³ã
ãã®äŸã§ã¯ïŒ
- 笊å·s = 0ïŒæ£ã®æ°ïŒ
- 泚æE = 01111100 2 -127 10 = -3
- ä»®æ°M = 1.01 2 ïŒæåã®åäœã¯æ瀺çã§ã¯ãããŸããïŒ
- ãã®çµæãF = 1.01 2 e-3 = 2 -3 +2 -5 = 0.125 + 0.03125 = 0.15625
ããå°ã詳现ãªèª¬æ
ããã§ã¯ãæ°å€ã101ãã®ãã€ããªè¡šçŸãåŠçããå·Šã«æ°æ¡ã·ããããŸãã 1.01ã¯ãã€ããªè¡šçŸã§ããã1Ã2 0 + 0Ã2 -1 + 1Ã2 -2ãæå³ããŸãã ã«ã³ããå·Šã«3æ¡ã·ãããããšã1.01e-3 = 1Ã2 -3 + 0Ã2 -4 + 1Ã2 -5 = 1Ã0.125 + 0Ã0.0625 + 1Ã0.03125 = 0.125 + 0ã«ãªããŸãã ã03125 = 0.15625ã
3.1ç¹å¥ãªçªå·ïŒãŒããç¡éãããã³äžç¢ºå®æ§
IEEE754ã§ã¯ãæ°å€ã0ãã¯E = E min -1ïŒåäžã®å Žåã¯-127ïŒã«çãã次æ°ãšãŒãä»®æ°ã®å€ã§è¡šãããŸãã ç¬ç«ããæ°å€ãšããŠãŒããå°å ¥ãããšïŒæ£èŠåãããè¡šçŸã§ã¯ãŒããè¡šçŸã§ããªãããïŒãç®è¡ã®å€ãã®å¥åŠãªåé¡ãåé¿ã§ããŸããã ãŸãããŒãã®æäœã¯åå¥ã«åŠçããå¿ èŠããããŸãããéåžžã¯éåžžã®æ°å€ãããé«éã«å®è¡ãããŸãã
ãŸããIEEE754ã¯ç¹å¥ãªçªå·ã®è¡šçŸãæäŸãããã®æäœã¯äŸå€ãåŒãèµ·ãããŸãã ãããã®æ°å€ã«ã¯ãç¡é倧ïŒÂ±âïŒãšäžç¢ºå®æ§ïŒNaNïŒãå«ãŸããŸãã ãããã®æ°å€ã«ããããªãŒããŒãããŒæã«é©åãªå€ãè¿ãããšãã§ããŸãã ç¡é倧ã¯ãE = E max +1ã®æ¬¡æ°ãšãŒãä»®æ°ãæã€æ°å€ãšããŠè¡šãããŸãã ãªãŒããŒãããŒããã³ãŒã以å€ã®æ°å€ããŒãã§é€ç®ããããšã«ãããç¡é倧ãååŸã§ããŸãã éçºè ã¯ãé åœãšé€æ°ãç¹å®ã®æ°ã«ãªãåŸåãããå Žåãéçã®ååšã«åºã¥ããŠéšéã®ç¡é倧ã決å®ããŸããã ãããã£ãŠãc / 0 ==±âïŒããšãã°ã3/0 = +âãããã³-3 / 0 =-âïŒãããã¯ã被é€æ°ãå®æ°ã«ãªããé€æ°ããŒãã«ãªãå Žåãå¶éãç¡éã«ãªãããã§ãã 0/0ã§ã¯ãå¶éã¯ååšããªããããçµæã¯äžç¢ºå®ã«ãªããŸãã
äžç¢ºå®æ§ãŸãã¯NaNïŒéæ°å€ããïŒã¯ãç®è¡æŒç®ãåžžã«äœããã®æå³ã®ãªãå€ãè¿ãããšãã§ããããã«èæ¡ãããè¡šçŸã§ãã IEEE754ã§ã¯ãNaNã¯E = E max +1ã®æ°å€ãšããŠè¡šãããä»®æ°ã¯ãŒãã§ã¯ãããŸããã NaNã䜿çšããæäœã¯ãNaNãè¿ããŸãã å¿ èŠã«å¿ããŠãããã°ã©ã ã解éã§ããä»®æ°éšã«æ å ±ãæžã蟌ãããšãã§ããŸãã ããã¯èŠæ Œã§ã¯æå®ãããŠããããä»®æ°ã¯ã»ãšãã©ã®å Žåç¡èŠãããŸãã
NaNãå ¥æããã«ã¯ã©ãããã°ããã§ããïŒ æ¬¡ã®ããããã®æ¹æ³ã§ïŒ
- â+ïŒ-âïŒ
- 0Ãâ
- 0/0ãâ/â
- sqrtïŒxïŒãx <0
å®çŸ©äžãNaNâ NaNã§ãããããã£ãŠãå€æ°ã®å€ã確èªããã«ã¯ããããèªåã§æ¯èŒããã ãã§ãã
ãªããŒãèšå·ïŒãŸãã¯+0察-0ïŒ
奜å¥å¿readerçãªèªè ã¯ãæµ®åå°æ°ç¹æ°ã®èšè¿°è¡šçŸã«ç¬Šå·ã®ã¿ãç°ãªã2ã€ã®ãŒããããããšã«æ°ã¥ãããšæããŸãã ãããã£ãŠã3ã»ïŒ+0ïŒ= + 0ãããã³3ã»ïŒ-0ïŒ=-0ã§ãã ãã ãã+ 0 = -0ãæ¯èŒããå Žåã æšæºã§ã¯ã笊å·ã¯æå³çã«ä¿æããããããä¹ç®ãŸãã¯é€ç®ã®éã«ãªãŒããŒãããŒãŸãã¯æææ§ã®åªå€±ã®çµæãšããŠç¡éãŸãã¯ãŒãã«ãªãåŒã¯ãäŸç¶ãšããŠæãæ£ããçµæãæäŸã§ããŸãã ããšãã°ããŒãã«ç¬Šå·ããªãã£ãå Žåã1 / =âãš1 /-âã¯0ã§ãããããx =±âã®å ŽåãåŒ1 /ïŒ1 / xïŒ= xã¯çã«ãªããŸããã
å¥ã®äŸïŒ
ïŒ+â/ 0ïŒ+â= +âãäžæ¹ã§ïŒ+â/ -0ïŒ+â= NaN
ãã®å Žåãç¡é倧ã¯NaNããã©ã®ããã«åªããŠããŸããïŒ NaNãç®è¡åŒã«çŸããå ŽåãåŒå šäœã®çµæã¯åžžã«NaNã«ãªããšããäºå®ã åŒã§ç¡éãæ€åºãããå Žåãçµæã¯ãŒããç¡éããŸãã¯éåžžã®æµ®åå°æ°ç¹æ°ã«ãªããŸãã ããšãã°ã1 /â= 0ã
3.3éæ£èŠåæ°
倧ããªã¹ãããŒã¯ã¯ã1.00ã®ä»®æ°ãæã€æ°åã瀺ããŸãã ãŒãããæãè¿ãæ°å€ïŒ0-0.5ïŒãŸã§ã®è·é¢ã¯ããã®æ°å€ãã次ã®æ°å€ïŒ0.5-0.625ïŒãŸã§ã®è·é¢ããã倧ããããšãããããŸãã ã€ãŸãã0.5ãã1ãŸã§ã®ä»»æã®2ã€ã®æ°å€ã®å·®ã¯ããããã®æ°å€ãçãããªããŠã0ã«ãªããŸãã ããã«æªãããšã«ã1ãã倧ããæ°ã®å·®ã¯0.5ãš0ã®éã®ã®ã£ããã«å ¥ããŸããããšãã°ãã1.5-1.25 = 0ãã§ãïŒå³ãåç §ïŒã
ãã¹ãŠã®ããã°ã©ã ãããŒãã«è¿ãç©Žãã«é¥ãããã§ã¯ãããŸããã 70幎代ã®çµ±èšã«ãããšãå¹³åããŠãåã³ã³ãã¥ãŒã¿ãŒã¯æã«äžåºŠãã®åé¡ã«ééããŸããã ã³ã³ãã¥ãŒã¿ãŒã倧è¡åããããšãèãããšãKCSéçºè ã¯ãã®åé¡ãããŒããŠã§ã¢ã¬ãã«ã§è§£æ±ºããã®ã«ååãªã»ã©æ·±å»ã ãšèããŸããã 圌ããææ¡ãã解決çã¯æ¬¡ã®ãšããã§ããã E = E min -1ïŒãããŒãã®å Žåã¯ã-127ãïŒããã³ä»®æ°ããŒãã®å Žåãæ°å€ã¯ãŒãã«çãããšèŠãªãããŸãã ä»®æ°ããŒãã§ãªãå Žåãæ°å€ã¯éãŒããšã¿ãªããããã®é åºã¯E = E minã§ãããšæ³å®ãããä»®æ°ã®æé»çãªäžäœãããã¯ãŒãã«èšå®ãããŸãã ãã®ãããªæ°å€ã¯éæ£èŠåãšåŒã°ããŸãã
å³å¯ã«èšãã°ãæµ®åå°æ°ç¹æ°ã¯æ¬¡ã®ããã«ãªããŸãã
ïŒ-1ïŒE minâ€Eâ€Emaxã®å Žåã s Ã1.MÃ2 E ïŒæ£èŠåæ°ïŒ
ïŒ-1ïŒ s à 0ãE = E min -1ã®å ŽåãMÃ2 Emin ã ïŒéæ£èŠåæ°ïŒ
äŸã«æ»ããŸãããã E min = -1 æ°ããé åºå€E = -2ãå°å ¥ããŸãããã®å Žåãæ°å€ã¯éæ£èŠåãããŸãã ãã®çµæãæ°å€ã®æ°ããè¡šçŸãåŸãããŸãã
0ãã0.5ã®ééã¯éæ£èŠåãããæ°å€ã§åããããäžèšã®0ã®äŸïŒ0.5-0.25ããã³1.5-1.25ïŒã§å€±æããªãããã«ããããšãã§ããŸãã ããã«ããããŒãã«è¿ãæ°å€ã®äžžã誀差ã«å¯ŸããŠãã¥ãŒãããå ç¢ã«ãªããŸããã
ããããããã»ããµã§æ°å€ã®éæ£èŠåè¡šçŸã䜿çšããèŽ æ²¢ã¯ç¡æã§ã¯æäŸãããŸããã ãã®ãããªæ°ã¯ãã¹ãŠã®ç®è¡æŒç®ã§ç°ãªãæ¹æ³ã§åŠçããå¿ èŠããããšããäºå®ã«ããããã®ãããªç®è¡ã§ã®äœæ¥ãå¹æçã«ããããšã¯å°é£ã§ãã ããã«ãããããã»ããµã§ã®ALUã®å®è£ ã«ããã«å°é£ãçããŸãã éæ£èŠåãããæ°å€ã¯éåžžã«äŸ¿å©ã§ãããäžèœè¬ã§ã¯ãªãããŒããžã®äžžãã远跡ããå¿ èŠããããŸãã ãããã£ãŠããã®æ©èœã¯æšæºã®éçºã«ãããŠé害ãšãªããæã匷ãæµæã«äŒããŸããã
3.4 IEEE754ã®çªå·ã·ãŒã±ã³ã¹
IEEE754圢åŒã§æ°å€ãè¡šçŸããé©ãã¹ãæ©èœã®1ã€ã¯ãé åºãšä»®æ°ããå®è¡ãããæŽæ°{n}ã®ã·ãŒã±ã³ã¹ã圢æããããã«æ¬¡ã ã«é 眮ãããããšã§ãã
n <n + 1âFïŒnïŒ<FïŒn + 1ïŒãããã§ãFïŒnïŒã¯æŽæ°nããããããé åºãšä»®æ°ã«åå²ããããšã«ãã圢æãããæµ®åå°æ°ç¹æ°ã§ãã
ãããã£ãŠãæ£ã®æµ®åå°æ°ç¹æ°ãååŸããŠæŽæ°ã«å€æããã1ããè¿œå ãããšããã®ç®è¡ã§è¡šçŸå¯èœãªæ¬¡ã®æ°ãåŸãããŸãã Cã§ã¯ãããã¯æ¬¡ã®ããã«å®è¡ã§ããŸãã
float a=0.5; int n = *((int*) &a); float b = *((float*) &(++n)); printf(" %e : %e, (%e)\n", a, b, ba);
ãã®ã³ãŒãã¯ã32ãããæŽæ°ã®ã¢ãŒããã¯ãã£ã§ã®ã¿æ©èœããŸãã
4.æµ®åå°æ°ç¹æŒç®ã®èœãšãç©Ž
ä»ããç·Žç¿ããŸãã ããã°ã©ãã³ã°æã«ã¯ç¹ã«æ³šæããå¿ èŠãããæµ®åå°æ°ç¹æŒç®ã®æ©èœãæ€èšããŠãã ããã
4.1äžžã
ç¹ã«å粟床ã䜿çšããŠããå Žåã¯ãææ°ã®æµ®åå°æ°ç¹æŒç®ã®äžžã誀差ã«ãããšã©ãŒã«å¯ŸåŠããããšã¯å°é£ã§ãã IEEE754èŠæ Œã®äžžãèŠåã§ã¯ãç®è¡æŒç®ã®çµæã¯ãæ£ç¢ºãªå€ã§å®è¡ããããã®åœ¢åŒã§è¡šãããæãè¿ãæ°å€ã«äžžãããããã®ããã«ãªããŸãã ããã«ã¯ALUããã®è¿œå ã®åªåãå¿ èŠã§ãããäžéšã®ã³ã³ãã€ã©ãªãã·ã§ã³ïŒgccã®ã-ffast-mathããªã©ïŒã¯ãã®åäœãç¡å¹ã«ããå ŽåããããŸãã IEEE754ã®äžžãã®æ©èœïŒ
- æšæºã§æãè¿ããã®ãžã®äžžãã¯ã以åã®ããã«ã¯è¡ãããŸããã 0.5ã1ïŒåãäžãïŒã«äžžãããšãäžžã誀差ãç¡é倧ã«å¢å ããäžé£ã®æäœãããããšãæ°åŠçã«ç€ºãããŠããŸãã ãããã£ãŠãIEEE754ã¯å¶æ°ã«äžžãèŠåãé©çšããŸãã ãããã£ãŠã12.5ã¯12ã«ã13.5ã¯14ã«äžžããããŸãã
- æµ®åå°æ°ç¹æŒç®ã®äžžãã«é¢ããæãå±éºãªæäœã¯ãæžç®ã§ãã è¿ãæ°åãæžç®ãããšãæå¹æ°åã倱ãããå¯èœæ§ããããŸãã
çžå¯Ÿèª€å·®ãå€§å¹ ã«å¢å ããå¯èœæ§ããããŸãã - å€ãã®äžè¬çãªæ°åŒã«ã€ããŠãæ°åŠè ã¯äžžã誀差ãå€§å¹ ã«æžããããšãã§ããç¹å¥ãªåœ¢åŒãéçºããŸããã ããšãã°ãåŒãx 2 -y 2 ãã®èšç®ã¯ãåŒãïŒxyïŒïŒx + yïŒãã䜿çšããŠæé©ã«èšç®ãããŸãã
4.2éé£æ³ç®è¡æŒç®
æµ®åå°æ°ç¹æŒç®ã§ã¯ãã«ãŒã«ïŒa * bïŒ* c = a *ïŒb * cïŒã¯ç®è¡æŒç®ã«ã¯é©çšãããŸããã äŸãã°
ïŒ10 20 +1ïŒ-10 20 = 0â ïŒ10 20 -10 20 ïŒ+ 1 = 1
æ°å€ãåèšããããã°ã©ã ããããšããŸãã
double s = 0.0; for (int i=0; i<n; i++) s = s + t[i];
äžéšã®ã³ã³ãã€ã©ã¯ãããã©ã«ãã§ãè€æ°ã®ALUãåæã«äœ¿çšããããã«ã³ãŒããæžãæããããšãã§ããŸãïŒnã2ã§å²ããšä»®å®ããŸãïŒã
double sa[2], s; sa[0]=sa[1]=0.0; for (int i=0; i<n/2; i++) { sa[0]=sa[0]+t[i*2+0]; sa[1]=sa[1]+t[i*2+1]; } S=sa[0]+sa[1];
å ç®ã®æäœã¯é£æ³çã§ã¯ãªãããããããã®2ã€ã®ããã°ã©ã ã¯ç°ãªãçµæãçæããå¯èœæ§ããããŸãã
4.3æ°å€å®æ°
ãã¹ãŠã®10é²æ°ã«2é²æµ®åå°æ°ç¹è¡šçŸãããããã§ã¯ãªãããšã«æ³šæããŠãã ããã ããšãã°ãæ°å€ã0.2ãã¯å粟床ã§ã0.200000003ããšããŠè¡šãããŸãã ãããã£ãŠãã0.2 + 0.2â0.4ãã å¥ã®çµ¶å¯Ÿèª€å·®
ã±ãŒã¹ã¯é«ããªããããããŸãããããµã€ã¯ã«ã§ãã®ãããªå®æ°ã䜿çšãããšã环ç©ãšã©ãŒãååŸã§ããŸãã
4.4æäœ2ã€ã®å€ã®éžæ
æå°å€ãéžæããå¿ èŠããã2ã€ã®å€ããããšããŸãã Cã§ã¯ãããã¯æ¬¡ã®ããããã®æ¹æ³ã§å®è¡ã§ããŸãã
- x <yïŒ xïŒy
- x <= yïŒ xïŒy
- x> yïŒ yïŒx
- x> = yïŒ yïŒx
å€ãã®å Žåãã³ã³ãã€ã©ã¯1ã€ã®ããã»ããµåœä»€ã§å®è¡ããããããããããåçãšèŠãªããåžžã«æåã®ãªãã·ã§ã³ã䜿çšããŸãã ãã ãã±0ãšNaNãèæ ®ãããšããããã®æŒç®ã¯ã©ã®ãããªæå³ã§ãåçã§ã¯ãããŸããã
x | y | x <yïŒ xïŒy | x <= yïŒ xïŒy | x> yïŒ yïŒx | x> = yïŒ yïŒx |
+0 | -0 | -0 | +0 | +0 | -0 |
ãã³ | 1 | 1 | 1 | ãã³ | ãã³ |
4.5æ°å€ã®æ¯èŒ
æµ®åå°æ°ç¹æ°ãåŠçãããšãã«éåžžã«äžè¬çãªãšã©ãŒã¯ãåçæ§ããã§ãã¯ãããšãã«çºçããŸãã äŸãã°
float fValue = 0.2; if (fValue == 0.2) DoStuff();
ããã§ã®ééãã¯ã0.2ã¯æ£ç¢ºãªãã€ããªè¡šçŸãæããªãããšã§ãã次ã«ã0.2ã¯å粟床ã®å®æ°ã§ãããå€æ°fValueã¯åäžã§ããããã®æ¯èŒã®åäœã«ã€ããŠã®ä¿èšŒã¯ãããŸããã
æè¯ã®ãããããŸã ééã£ãæ¹æ³ã¯ãå·®ã蚱容絶察誀差ãšæ¯èŒããããšã§ãïŒ
if (fabs(fValue â fExpected) < 0.0001) DoStuff(); // fValue=fExpected?
ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ããã®æ°å€èªäœã®å¢å ã«äŒŽããæ°å€ãè¡šããšã©ãŒãå¢å ããããšã§ãã ãããã£ãŠãããã°ã©ã ãã10000ããäºæããŠããå Žåãäžèšã®çåŒã¯æãè¿ãé£æ¥çªå·ïŒ10000,000977ïŒã«ã€ããŠã¯æºããããŸããã ããã¯ãããã°ã©ã ãå粟床ããå粟床ãžã®å€æãè¡ãå Žåã«ç¹ã«åœãŠã¯ãŸããŸãã
é©åãªæ¯èŒæé ãéžæããã®ã¯é£ãããèå³ã®ããèªè ã§ãã ãã«ãŒã¹ã»ããŒãœã³ã®èšäºãåç §ããŠãã ããã æµ®åå°æ°ç¹æ°ãšæŽæ°å€æ°ãžã®å€æãæ¯èŒããããšãææ¡ããŠããŸãã ããã¯ã移æ€æ§ã®ããæ¹æ³ã§ã¯ãããŸããããæé«ã§ãã
bool AlmostEqual2sComplement(float A, float B, int maxUlps) { // maxUlps , // NaN assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024); int aInt = *(int*)&A; // aInt, , if (aInt < 0) aInt = 0x80000000 - aInt; //aInt &= 0x7fffffff; //(. Vayun) // bInt int bInt = *(int*)&B; if (bInt < 0) bInt = 0x80000000 - bInt; /*aInt &= 0x7fffffff;*/ unsigned int intDiff = abs(aInt - bInt); /*(. Vayun)*/ if (intDiff <= maxUlps) return true; return false; }
ãã®ããã°ã©ã ã§ã¯ãmaxUlpsïŒUnits-In-Last-PlaceããïŒã¯ããã§ãã¯å€ãšæåŸ å€ã®éã«ããæµ®åå°æ°ç¹æ°ã®æ倧æ°ã§ãã ãã®å€æ°ã®ãã1ã€ã®æå³ã¯ãæ¯èŒå¯Ÿè±¡ã®æ°åã®2é²æ°ïŒæäžäœããå§ãŸãïŒã®æ°ãéãããšã§ãã ããšãã°ãmaxUlps = 16ã¯ãäžäœ4ãããïŒlog 2 16ïŒãäžèŽããªãå¯èœæ§ãããããšãæå³ããæ°å€ã¯äŸç¶ãšããŠçãããšèŠãªãããŸãã ããã«ãæ°å€10000ãšæ¯èŒãããšã絶察誀差ã¯0.0146ã«çãããªãã0.001ãšæ¯èŒãããšã誀差ã¯0.00000001ïŒ10 -8 ïŒæªæºã«ãªããŸãã
5. IEE754ã®ãµããŒãã®å®å šæ§ã確èªããŸã
ããã»ããµãIEEE754æšæºã«å®å šã«æºæ ããŠããå ŽåãæšæºããŒã¿åïŒCã®float / doubleãªã©ïŒã䜿çšããããã°ã©ã ã¯ãç°ãªãã³ã³ãã¥ãŒã¿ãŒã§åãçµæãçæãããšæããŸããïŒ ããªãã¯ééã£ãŠããŸãã 移æ€æ§ãšã³ã³ãã©ã€ã¢ã³ã¹ã¯ãã³ã³ãã€ã©ãšæé©åãªãã·ã§ã³ã®åœ±é¿ãåããŸãã William Kahanã¯CïŒFortranã®ããŒãžã§ã³ããããŸãïŒã§ããã°ã©ã ãäœæããŸãããããã«ãããIEEE754ã®ãªã³ã¯ãã¢ãŒããã¯ãã£+ã³ã³ãã€ã©+ãªãã·ã§ã³ããã©ããã確èªã§ããŸãã ãæµ®åå°æ°ç¹ãã©ãã€ã¢ããšåŒã°ãããã®ãœãŒã¹ã³ãŒãã¯ããŠã³ããŒãã§ããŸã ã åæ§ã®ããã°ã©ã ãGPUã§å©çšå¯èœã§ãã ãã®ãããããšãã°ãIntelã³ã³ãã€ã©ïŒiccïŒã¯ããã©ã«ãã§ãç·©åããããIEEE754ã¢ãã«ã䜿çšããããããã¹ãŠã®ãã¹ããå®è¡ãããããã§ã¯ãããŸããã ãªãã·ã§ã³ã-fp-model preciseãã䜿çšãããšãæšæºã«å³å¯ã«æºæ ããŠããã°ã©ã ãã³ã³ãã€ã«ã§ããŸãã GCCã³ã³ãã€ã©ã«ã¯ã-ffast-mathããªãã·ã§ã³ããããããã䜿çšãããšIEEE754ã®äžäžèŽãçºçããŸãã
ãããã«
æåŸã«ãæçãªç©èªã GPUã§ãã¹ããããžã§ã¯ãã«åãçµãã§ãããšãã1ã€ã®ããã°ã©ã ã®ã·ãªã¢ã«ããŒãžã§ã³ãšãã©ã¬ã«ããŒãžã§ã³ããããŸããã ã©ã³ã¿ã€ã ãæ¯èŒãããšã300åã®å éãåŸãããããéåžžã«æºè¶³ããŠããŸãã ãããåŸã«ãªã£ãŠãGPUã§ã®èšç®ã¯ã厩ãããNaNã«å€ãããGPUã§ã®èšç®ã¯éåžžã®æ°å€ãããé«éã§ããããšãå€æããŸããã ãã1ã€èå³æ·±ãã®ã¯ãGPUãšãã¥ã¬ãŒã¿ãŒïŒCPUäžïŒã®åãããã°ã©ã ãæ£ããçµæãçæããããGPUèªäœã§ã¯ãªãã£ãããšã§ãã ãã®åŸããã®GPUãIEEE754æšæºãå®å šã«ãµããŒãããŠããããçŽæ¥çãªã¢ãããŒããæ©èœããªãã£ãããšãåé¡ã§ããããšãå€æããŸããã
çŸåšãæµ®åå°æ°ç¹æŒç®ã¯ã»ãŒå®ç§ã§ãã ã»ãšãã©ã®å ŽåãçŽ æŽãªã¢ãããŒããæ©èœãããã¹ãŠã®æ©èœãèæ ®ããŠããªãããã°ã©ã ã¯æ£ããçµæããããããŸãããŸããèšèŒãããŠããèœãšãç©Žã¯ãšããŸããã¯ãªã±ãŒã¹ã®ã¿ã«é¢ä¿ããŸãã ããããåžžã«èŠæããªããã°ãªããŸãããã³ã³ãã¥ãŒã¿ãŒæ°åŠãªã©ã®åé¡ã§ã¯ãçæãèžãã®ã¯ç°¡åã§ãã
PSéèŠãªç¹ã«ã€ããŠã¯uqlockã«æè¬ããŸãã ãéãæµ®åå°æ°ç¹æ°ãšããŠä¿åããããšã¯ã§ããŸããã ãã®å ŽåãéèŠãªã«ããŽãªãåºå¥ã§ããŸããã ããã°ã©ãã³ã°èšèªã«åºå®å°æ°ç¹ããŒã¿åããªãå Žåãç¶æ³ããæãåºãããéãæŽæ°ãšããŠä¿åã§ããŸããããã¯ããããŒïŒå Žåã«ãã£ãŠã¯ãããŒã®äžéšïŒãæå³ããŸãã
PPSãŠãŒã¶ãŒã«èª€æ€ãšãšã©ãŒãçºèŠããŸããïŒ gribozavr ã kurokikaze ã Cenness ã TheShock ã perl_demon ã GordTremor ã fader44 ã DraculaDis ã icc ã f0rbidik ã Harkonnen ã AlexanderYastrebov ã Vayun ã EvilsInterrupt ïŒ