ä»æ¥ã¯å®æ°ã«ã€ããŠã話ããŸãã ããæ£ç¢ºã«ã¯ãåæ°æ°éã®èšç®ã«ãããããã»ããµã«ãã衚瀺ã«ã€ããŠã ç§ãã¡ã¯ããããã3.5ã®ä»£ããã«3,4999990123ãšãã圢åŒã®æ°å€ã®æååãåºåããããšã«çŽé¢ããŸãããããã«æªãããšã«ãçè«çãªçµæãšããã°ã©ã ã³ãŒãã®å®è¡ã®çµæãšããŠè¡ãããçµæãšã®èšç®åŸã®å€§ããªéãã§ãã ããã«ã¯ã²ã©ãç§å¯ã¯ãããŸãããæµ®åå°æ°ç¹è¡šçŸã¢ãããŒãã®é·æãšçæã«ã€ããŠèª¬æãã代æ¿ã®åºå®å°æ°ç¹ãã¹ãæ€èšããåºå®ç²ŸåºŠã§å°æ°ã®ã¯ã©ã¹ãèšè¿°ããŸãã
ãã€ã³ãã¯ã©ãã«è¡ããŸãã
ããã»ããµãå¿ ãããå®æ°ãç解ããŠããªãã£ãã®ã¯ç§å¯ã§ã¯ãããŸããã ããã°ã©ãã³ã°æ代ã®dææãæåã®ã³ããã»ããµãŒãç»å Žããåã¯ãå®æ°ã¯ããŒããŠã§ã¢ã¬ãã«ã§ãµããŒããããŠããããããã»ããµãŒãããŸãæ©èœããæŽæ°ã䜿çšããŠã¢ã«ãŽãªãºã çã«ãšãã¥ã¬ãŒããããŠããŸããã ãããã£ãŠãå€ãè¯ããã¹ã«ã«ã®å®æ°åã¯çŸåšã®å®æ°ã®å ç¥ã§ããããããããå®æ°ã®ä»®æ°ãšææ°ãšããŠè«ççã«è§£éãããæŽæ°ã®äžäœæ§é ã§ããã
ä»®æ°ã¯ãæ¬è³ªçã«ããããªãã§æžãããæ°åã§ãã ææ°ã¯ãç¹å®ã®æ°NïŒéåžžãN = 2ïŒãäžããå¿ èŠããã床åãã§ãããã®ãããä»®æ°ãæãããšãç®çã®æ°ãåŸãããŸãïŒä»®æ°ã®æ¡å®¹éã«æ£ç¢ºïŒã 次ã®ããã«ãªããŸãã
x = m * N ^ e, m e â , .
ãããŸãããé¿ããããã1 <= | m | <Nãã€ãŸããçªå·ã¯ã«ã³ãã®åã«1ã€ã®èšå·ãä»ããŠããããã«æžã蟌ãŸããŸãããã³ã³ãã¯æªæãæã£ãŠåé€ãããçªå·ã¯æŽæ°ã«ãªããŸããã
ä»®æ°ã¯ãæ¬è³ªçã«ããããªãã§æžãããæ°åã§ãã ææ°ã¯ãç¹å®ã®æ°NïŒéåžžN = 2ïŒãäžããå¿ èŠããã床åãã§ããä»®æ°ãæãããšãç®çã®æ°ãåŸãããŸãã
æè¿ã§ã¯ãå®æ°ãæã€ãã¹ãŠã®ã¢ã«ãŽãªãºã ãšåæ§ã«ãéçºè ã¯æµ®åå°æ°ç¹æŒç®ãé¿ããããšããŸããã å®æ°ã䜿çšããã³ããã»ããµãŒåŠçæäœã¯ããã¹ãŠã®ããã»ããµãŒã§å®è¡ãããããã§ã¯ãããŸããããå®éã«ã¯ãåžžã«å¹ççã«æ©èœãããšã¯éããŸããã§ããã ããããæéãçµã¡ãçŸåšã§ã¯æµ®åå°æ°ç¹æŒç®ãããã»ããµã³ã¢ã«çµã¿èŸŒãŸããŠããŸããããã«ããããªãããã¯å®æ°ãç©æ¥µçã«åŠçããåãã¿ã€ãã®æŒç®ã䞊ååããŸãã
ããã»ããµã¬ãã«ã§ããŒããŠã§ã¢ã«ãã£ãŠãµããŒããããææ°ã®å®æ°ããä»®æ°ãšææ°ã«åããããŸãã ãã¡ãããæŽæ°æŒç®ã«ãªãã¿ã®ãããã¹ãŠã®æŒç®ã¯ãå®æ°ã®ããã»ããµåœä»€ã§ããµããŒããããŠãããå¯èœãªéãè¿ éã«å®è¡ãããŸãã
ãã®ãããªèšé²åœ¢åŒã¯ããŸãããã®ãããªæ°ã§ã®ä¹ç®ããã³é€ç®æŒç®ãéåžžã«å¹æçã§ããããšã«å ããŠããã®ãããªåœ¢åŒã§è¡šãããå ã®å®æ°ãåŸãããšãé£ãããªãããããã¹ãŠãéåžžã«è€éã§ãã ãã®æ°å€è¡šçŸã¯ãæµ®åå°æ°ç¹æ°ãšåŒã°ããŸãã
ãã€ãã³ã°æšæº
ããã»ããµã¬ãã«ã§ãµããŒããããæµ®åå°æ°ç¹å®æ°ã¯ãç¹å¥ãªåœéæšæºIEEE 754ã§èšè¿°ãããŠããŸãã èšç®ã®äž»ãª2ã€ã®ã¿ã€ãã¯ã å粟床 ïŒå粟床ïŒããã³å粟床 ïŒåç²ŸåºŠïŒ æµ®åå°æ°ç¹ ïŒ æµ®åå°æ°ç¹æ°ïŒã§ãã ãããã®ååã¯ãå粟床ãšå粟床ã®æ°å€ã®ãã€ããªè¡šçŸã®ããã深床ãçŽæ¥åæ ããŸããå粟床ã®è¡šçŸã«ã¯32ããããå²ãåœãŠãããå¥åŠãªããšã«ãå粟床衚çŸã«ã¯64ãããã2åå²ãåœãŠãããŸãã
IEEE 754-2008èŠæ Œã®æ°çã¯ãå粟床ãšå粟床ã«å ããŠã4å粟床ãããã«ã¯å粟床ã®æ¡åŒµç²ŸåºŠãæäŸããŸãã ãã ããC / C ++ã§ã¯ãfloatãšdoubleã®ä»ã«ãããããlong doubleåããããMicrosoftã§ã¯é åºã«ãµããŒããããŠããããVisual C ++ã§ã¯ä»£ããã«éåžžã®doubleã眮ãæããŸãã çŸæç¹ã®ããã»ããµã³ã¢ããååãšããŠãå粟床ããã³4å粟床ã®ã¿ã€ãããŸã ãµããŒãããŠããŸããã ãããã£ãŠãæµ®åå°æ°ç¹ãã¥ãŒãéžæããå Žåã¯ãfloatãšdoubleããã®ã¿éžæããå¿ èŠããããŸãã
æšæºã«ããæ°å€ã®ææ°ã®åºç€ãšããŠããããã2ã䜿çšãããäžèšã®åŒã¯æ¬¡ã®ããã«ãªããŸãã
x = m * (2 ^ e), 1 <= |m| < 2; m, e â
å粟床æ°ã®ãããåäœã®ã¬ã€ã¢ãŠãã¯æ¬¡ã®ããã«ãªããŸãã
| èšå·ã®äžã®1ããã| 8ãããææ°| 23ãããã®ä»®æ°|
å粟床ã®å Žåãããå€ãã®ãããã䜿çšã§ããŸãã
| èšå·ã®äžã®1ããã| 11ãããåºå±è | 52ãããã®ä»®æ°|
ã©ã¡ãã®å Žåãã笊å·ãããã0ã®å Žåãæ°å€ã¯æ£ã§ãããè² ã®æ°å€ã«ã¯1ãèšå®ãããŸãã ãã®èŠåã¯æŽæ°ã«äŒŒãŠããŸãããå¯äžã®éãã¯ãæŽæ°ãšã¯å¯Ÿç §çã«ãå ç®ã®å察ã®æ°å€ãååŸããã«ã¯ã笊å·ã®1ããããå転ããã ãã§ååã§ãããšããããšã§ãã
ä»®æ°ã¯ãã€ããªã§æžã蟌ãŸãããããæŽæ°éšåã¯ãã§ã«1ã«çãããããä»®æ°ã¬ã³ãŒãã§ã¯åžžã«ãã€ããªã¬ã³ãŒãã«æ ŒçŽãããŠããªã1ããããæå³ããŸãã ä»®æ°ã®ãããã¯ãæ£èŠåãããæ°å€ã®å°æ°éšåã2é²è¡šèšã§æ£ç¢ºã«æ ŒçŽããŸãã
ä»®æ°ã¯ãã€ããªåœ¢åŒã§èšè¿°ãããæŽæ°éšåïŒæããã«1ã«çããïŒã¯ç Žæ£ããããããä»®æ°ããã€ããªåœ¢åŒã§æ ŒçŽãããããã1ãããé·ãããšã決ããŠå¿ããŸãã
ãã®æšæºã§è¡šãããšãã§ããæ°å€ã®å°æ°ç¹ä»¥äžã®ç²ŸåºŠãèšç®ããããã«å士å·ãååŸããå¿ èŠã¯ãããŸããã2^ïŒ23 + 1ïŒ= 16 777 216; ããã¯ãå粟床ã§å®æ°ãè¡šçŸãã粟床ãå°æ°ç¹ä»¥äž7æ¡ããããã«è¶ ãããšããäºå®ãæããã«ç€ºããŠããŸãã ããã¯ããã®åœ¢åŒã§ã¯ä¿åã§ããªãããšãæå³ããŸããããšãã°ã123,456.78ãšããæ°åã¯äžè¬ã«å°ããæ°åã§ããã100åã®1ããå§ãŸãæ°åã¯ééã£ãŠããŸãã 32ãããæŽæ°ã«ãå®å šã«é©åãã1 234 567 890ãšãã圢åŒã®å€æ°ã®å Žåãæ°çŸåäœã§ãšã©ãŒãçºçãããããç¶æ³ã¯è€éã§ãã ãããã£ãŠãããšãã°ãC ++ã§ã¯ãå®æ°ã®å Žåãããã©ã«ãã§doubleåã䜿çšãããŸãã å粟床ã®æ°å€ã®ä»®æ°ã¯ããã§ã«15æ¡ãè¶ ããŠããŸãïŒ2 ^ 52> = 4 503 599 627 370 496ãã¹ãŠã®32ãããæŽæ°ã«éãã«å¯Ÿå¿ããæ¬åœã«å€§ããª64ãããæŽæ°ïŒ10é²æ°19æ¡ïŒã§ã®ã¿ãšã©ãŒãçºçããŸããååãšããŠãæ°çŸåäœã§ã¯ãã§ã«éèŠã§ã¯ãããŸããã ããæ£ç¢ºãªæ å ±ãå¿ èŠãªå Žåã¯ããã®èšäºã§å¿ ã圹ç«ã¡ãŸãã
åºå±è ã®æ¹ãžã ããã¯éåžžã®æŽæ°ã®ãã€ããªè¡šçŸã§ã10ã环ä¹ããŠæ£èŠå圢åŒã®ä»®æ°ãä¹ç®ããŠå ã®æ°ãååŸããå¿ èŠããããŸãã ããã«ãæšæºã§ã¯ãªãã»ãããå°å ¥ãããŠããã ãã§ããã10ã®ã¹ãä¹ ïŒãããããã€ã¢ã¹ææ° -ãªãã»ããææ°ïŒãåŸãããã«ããã€ããªè¡šçŸããæžç®ããå¿ èŠããããŸãã æ¯èŒæŒç®ãç°¡çŽ åããããã«ææ°ãã·ãããããŸããã€ãŸããå粟床ã®å Žåã¯å€127ããå粟床ã®å Žå1023ãååŸãããŸãããããã¯ãã¹ãŠéåžžã«è€éã«èãããã®ã§ãæµ®åå°æ°ç¹åã®ç« ãã¹ãããããŸãã ããããç¡é§ã«ïŒ
ããããã®æ°Žæ³³
å°ãæ確ã«ããããã«ãäŸãèããŠã¿ãŸãããã æ°å€640 ïŒ= 512 + 128ïŒãå粟床ã®å®æ°ãšããŠãã€ããªåœ¢åŒã§ãšã³ã³ãŒãããŸãã
- æ£ã®æ°-笊å·ãããã¯0ã«ãªããŸãã
- æ£èŠåãããä»®æ°ãååŸããã«ã¯ãæ°å€ã512ã§é€ç®ããå¿ èŠããããŸããæ倧次æ°ã§ããæ°å€ãããå°ããã640/512 = 512/512 + 128/512ãŸãã¯1 + 1/4ã«ãªãããããããã€ããªã§1.01ã«ãªããŸãã«ãããªã®ãããã¯01000000000000000000000ã«ãªããŸãã
- åã³1 + 1/4ãã640ãååŸããã«ã¯ã9ã«çããææ°ãæå®ããå¿ èŠããããŸããã¡ããã©2 ^ 9 = 512ãä»®æ°ãæ£èŠåãããšãã«æ°å€ãé€ç®ããæ°ã§ããããã€ããªåœ¢åŒã§ã¯ãªãã»ããè¡šçŸãå¿ èŠã§ããå粟床ã®å®æ°ã®å Žåã127ãè¿œå ããå¿ èŠãããã127 + 9 = 128 + 8ã«ãªããŸããããã¯ããã€ããªåœ¢åŒã§10001000ã®ããã«èšè¿°ãããŸãã
å粟床ã®å Žåãã»ãšãã©ãã¹ãŠãåãã«ãªããŸãããä»®æ°éšã®å°æ°éšã®å³åŽã«ã¯ããã«å€ãã®ãŒããå«ãŸããææ°ã¯1023 + 9 = 1024 + 8ã«ãªããŸããã€ãŸããæäžäœããããšææ°ã®æ°ã®éã®ãŒãããå°ã倧ããã§ãïŒ ãæ éã«ç解ããã°ããã¹ãŠãããã»ã©æãããã§ã¯ãããŸããã
宿é¡ïŒæ¬¡ã®å®æ°ã®ãã€ããªè¡šèšãç解ããïŒãã©ã¹ãšãã€ãã¹ã®ç¡éå€§ïŒ INF-ç¡é倧ïŒããŒãããã€ãã¹ãŒããããã³æ°ã§ã¯ãªãæ°ïŒ NaN-æ°ã§ã¯ãªãïŒã
ãã€ã®ããã«æ³³ããªïŒ
1ã€ã®éèŠãªã«ãŒã«ããããŸããæ°å€ãè¡šçŸããããã®å圢åŒã«ã¯ãæ³³ãããšãã§ããªãç¬èªã®å¶éããããŸãã ããã«ãC / C ++ããã°ã©ã ã®åäœã¯ã2ã€ã®å€§ããªæ£ã®æŽæ°ã®è¿œå ãšããŠå°ããªè² ãäžãããããšãã«ç©ãããªé¡ãããããšã§ããããããããã®å¶éãè¶ ããªãããã«ããããšã¯ããã°ã©ã次第ã§ãã ãã ããæŽæ°ã®å Žåãæ倧å€ãšæå°å€ã®ã¿ãèæ ®ããå¿ èŠãããå Žåãæµ®åå°æ°ç¹è¡šçŸã®å®æ°ã«ã€ããŠã¯ãæ°å€ã®ããã深床ãããæ倧å€ã«æ³šæãæãå¿ èŠããããŸãã ææ°ã®ãããå粟床ã®æµ®åå°æ°ç¹è¡šçŸã®æ倧æ°ã¯10 308ãè¶ ããŸããå粟床ã®ææ°ã§ã10 38ãè¶ ããæ°å€ããšã³ã³ãŒãã§ããŸãã 64ãããæŽæ°ã®æ倧å€ã§ãããæ²æšãªã10 19ãšæ¯èŒãããšãæ倧å€ãšæå°å€ãèæ ®ããå¿ èŠã¯ã»ãšãã©ãªããšçµè«ä»ããããšãã§ããŸãããããããå¿ããŠã¯ãªããŸããã
æŽæ°ã«ã€ããŠãæ倧å€ãšæå°å€ã®ã¿ãèæ ®ããå¿ èŠãããå Žåãæµ®åå°æ°ç¹è¡šçŸã®å®æ°ã«ã€ããŠã¯ãæ°å€ã®ããã深床ã«é¢ããŠã¯æ倧å€ããã泚æãæãå¿ èŠããããŸãã
ãã1ã€ã¯ã粟床ã®åé¡ã§ãã ä»®æ°ã®äžã®æ²æšãª23ãããã¯ãå°æ°ç¹ç¬¬8äœã§æ¢ã«ãšã©ãŒãçºçãããŸãã å粟床ã®æ°å€ã®å Žåãç¶æ³ã¯ããã»ã©åãããããã®ã§ã¯ãããŸããããããšãã°ãããŒã¿åŠçã§ãã€ã³ãã®åŸã«6ã€ã®åºå®æåãå¿ èŠã§ããã€ã³ããŸã§ã®æ°å€ãéåžžã«å€§ããããã®äžã«æ®ã£ãŠããã®ã9æåã ãã§ããå Žåãå°æ°ç¹ä»¥äž15æ¡ãéåžžã«ããã«åé¡ã«ãªããŸãã ãããã£ãŠãæ°ååãã«ã®éé¡ããããšãå°æ°éšåã«å€§ããªèª€å·®ãçããŸãã ãã®ãããªæ°ã®åŠçãéäžçã«è¡ããšãæ°ååãŠãŒãããåãŸããªãã£ãããšããçç±ã ãã§æ¶æ» ããå¯èœæ§ããããå°æ°éšåã®èª€å·®ãåèšãããèšå€§ãªæ®é«ã®æªèšäžããŒã¿ãèç©ãããŸããã
ããã ããçè«ã ã£ããïŒ å®éã«ã¯ã1000åã®1ã»ã³ããæ¶ããŠã¯ãªããããã¹ãŠã®æäœã®ãšã©ãŒã¯å³å¯ã«ãŒãã«çãããªããã°ãªããŸããã ãããã£ãŠãããžãã¹ããžãã¯ã§ã¯ãååãšããŠãC / C ++ã䜿çšããŸããããCïŒãŸãã¯Pythonã䜿çšããŸããããã§ãDecimalåã¯æ¢ã«æšæºã©ã€ãã©ãªã§æ§ç¯ãããŠãããæå®ãããå°æ°ç¹ä»¥äžæ¡æ°ã®ç²ŸåºŠã§ãšã©ãŒãªãã®å°æ°éšãåŠçããŸãã é«åºŠãªããã°ã©ãã³ã°èšèªã䜿çšããã«éåžžã«å€§ããªæ°ãåŠçããã¿ã¹ã¯ã«çŽé¢ããå ŽåãC ++ããã°ã©ãã¯äœããã¹ãã§ããããïŒ ã¯ãããã€ããšåãã§ãã10é²åã®é«ã¬ãã«ã©ã€ãã©ãªãšåæ§ã«ãé«ç²ŸåºŠã®å°æ°éšãæäœããããã®1ã€ã®å°ããªããŒã¿åãäœæããŠã®ã£ãããåããŸãã
æµ®åå°æ°ç¹ã»ã¡ã³ããè¿œå ãã
æµ®åå°æ°ç¹ãä¿®æ£ããŸãã èšç®ã®ç²ŸåºŠã«åé¡ããããããæµ®åå°æ°ç¹åãåé€ããããšã«æ±ºãããããæŽæ°åãæ®ã£ãŠããŸããæ倧ããã深床ãå¿ èŠãªãããæ倧ãããå¹ ã64ãããã®æŽæ°åãå¿ èŠã§ãã
ä»æ¥ãæè²ç®çã®ããã«ãæéåŸã®18æåãŸã§ã®ç²ŸåºŠãä¿èšŒããå®æ°ã®è¡šçŸãäœæããæ¹æ³ãæ€èšããŸãã ããã¯ãæŽæ°éšåãšå°æ°éšåã«ãããã2ã€ã®64ãããæŽæ°ãåçŽã«çµã¿åãããããšã«ãã£ãŠå®çŸãããŸãã ååãšããŠãåã³ã³ããŒãã³ãã®åäžã®çªå·ã®ä»£ããã«ãå€ã®é åãååŸããŠå®å šãªãé·ããç®è¡ãååŸããããšã誰ãæ°ã«ããŸããã ãããã粟床ã®åé¡ã解決ããã«ã¯ååã§ãããããå°æ°ç¹ã®ååŸã«18æ¡ã®ç²ŸåºŠã§äœæ¥ããããã2ã€ã®å€ã®éã®ãã€ã³ããåºå®ããã»ã¡ã³ãã§åããããšãã§ããŸãã
ç§ã«ãå°æ°ã泚ããŸãïŒ
ãŸããå°ãã®çè«ã æŽæ°ãšæŽæ°ã®å°æ°éšåã®2ã€ã®ã³ã³ããŒãã³ããnãšfãšããŠç€ºããŸããæ°å€èªäœã¯æ¬¡ã®åœ¢åŒã§è¡šçŸã§ããŸãã
x = n + f * 10 -18 ïŒnãfã¯æŽæ°ã0 <= f <10 18ïŒ
æŽæ°éšåã«ã€ããŠã¯ã64ãããæŽæ°ã®ç¬Šå·ä»ãã¿ã€ããæé©ã§ãããå°æ°éšåïŒç¬Šå·ãªãïŒã®å Žåãããã«ããå°æ¥ã®å€ãã®æäœãç°¡çŽ åãããŸãã
class decimal { ⊠private: int64_t m_integral; uint64_t m_fractional; };
ãã®å Žåã®æŽæ°éšã¯ãè¡šçŸãããæ°å€ãããå°ããæ倧æŽæ°ã§ããå°æ°éšã¯ããã®æ°å€ããæŽæ°éšã10 18åããŠæŽæ°ã«æžããçµæã§ãïŒf =ïŒx-nïŒ* 10 18 ã
è² ã®æ°å€ã®æŽæ°éšåã¯ãæ°å€èªäœãæ³ãšããŠå€§ãããªããå°æ°éšåã¯æ°å€èªäœã®10é²è¡šèšãšäžèŽããŸãããããšãã°ãæ°å€â1.67ã®å Žåãã³ã³ããŒãã³ãã¯n = â2ããã³f = 0.33 * 10 18ã«ãªããŸãã ãããããã®ãããªã¬ã³ãŒãã䜿çšãããšãè² ã®æ°ã«åå²ãå¿ èŠãªããããå ç®ããã³ä¹ç®ã¢ã«ãŽãªãºã ãåçŽåããã³é«éåã§ããŸãã
10é²åã®æäœ
ãã¡ããã粟床ãåäžããæ°å€ã®ã¿ã€ãã¯ãç®è¡æŒç®ãªãã§ã¯åœ¹ã«ç«ã¡ãŸããã è¿œå ã¯æ¯èŒçç°¡åã§ãïŒ
x = a + b * 1e-18, y = c + d * 1e-18, z = x + y = e + f * 1e-18, a, c, e: int64_t; b, d ,f: uint64_t; 0 <= b, d, f < 1e+18, z = (a + b * 1e-18) + (c + d * 1e-18) e = a + c + [b * 1e-18 + d * 1e-18] f = {b * 1e-18 + d * 1e-18} * 1e+18
NBïŒä»¥éã1eã®åœ¢åŒã®ãã¹ãŠã®ãšã³ããªã¯æŽæ°ã§ãã
ããã§ã[n]ã¯æ°å€ã®æŽæ°éšåãååŸãã{n}ã¯å°æ°éšåãååŸããŠããŸãã ãã¹ãŠåé¡ãããŸããããæŽæ°ã®å¶éãèŠããŠãããŠãã ããã å€1e + 18ã¯ã笊å·ãªã64ãããæŽæ°åuint64_tã®å€ã®éçã«æ¢ã«è¿ã¥ããŠããŸãïŒãã®ãããéžæããŸããïŒã
e = a + c + (b + d) div 1e+18, f = (b + d) mod 1e+18.
æ°å€ã䜿çšããæäœãå®è£ ãããšãã¯ãéäžçãªäœ¿çšã䌎ããããåžžã«2ã€ã®ããšãèæ ®ããå¿ èŠããããŸããæåã«ãä¹ç®ãšé€ç®ã®æäœãæå°éã«æããããã«åžžã«ã¢ã«ãŽãªãºã ãæé©åããå¿ èŠããããŸãããã®ãããæåã®ãã€ã³ããç°¡åã«å®è¡ãããããã«ãæ°åŒãäºåã«åçŽåãã䟡å€ããããŸã ãã®å Žåããã¹ãŠãæŽæ°ã®é€ç®ã«æå°åããæ®ããå¿ èŠãšããŸãã 第äºã«ãèšç®ãããåã®å¢çãè¶ããŠæ°å€ããªãŒããŒãããŒããå¯èœæ§ã®ããç¶æ³ããã¹ãŠç¢ºèªããå¿ èŠããããŸããããããªããšãåã䜿çšãããšãã«éåžžã«æçœãªãšã©ãŒãçºçããŸãã
ãã¡ãããaãšcãè¿œå ãããšãã«å¢çå€ããã§ãã¯ãã䟡å€ããããŸãã ãŸããbãšdã1e + 18æªæºã§ãããšããäºå®ã«åºã¥ããŠãïŒb + dïŒ<2 * 1e + 18ã§ããããšãããããŸããããã¯ãæ倧å€ãæåŸã®å ç®ãšããŠè¿œå ãããããšãæå³ããŸãããããã£ãŠãã¢ã«ãŽãªãºã äžãé€ç®ããŸã£ããèæ ®ããŠå®è¡é床ãæé©åããããšã¯ã§ããŸããæäœïŒ
e = a + c; f = b + d; if (f >= 1e+18) f -= 1e+18, ++e;
ããã§ã¯ãeã®å€ã®æ倧æŽæ°ã®ãã§ãã¯ã¯ã衚瀺ãç°¡åã«ããããã«çç¥ãããŠããŸãã
æžç®ã«ã€ããŠã¯ããã¹ãŠãããå°ãè€éã§ããããã§ã¯ã笊å·ãªãæŽæ°ã®ãŒãæªæºã®é·ç§»ãèæ ®ããå¿ èŠããããŸãã ã€ãŸããæžç®ããåã«2ã€ã®æ°å€ãæ¯èŒããå¿ èŠããããŸãã
e = a - c; if (b >= d) f = b - d; else f = (1e+18 - d) + b, --e;
äžè¬çã«ããããŸã§ã®ãšãããã¹ãŠãç°¡åã§ãã ä¹ç®ãšé€ç®ã®åã¯ããã¹ãŠãåžžã«åçŽã§ãã
åºå®ç²ŸåºŠã®ä¹ç®
æåã«ä¹ç®ãæ€èšããŠãã ããã å°æ°éšåã®æ°å€ã¯éåžžã«å€§ãããååãšããŠ1e + 18ã®ããè¿ãã«ãããããã¢ã»ã³ãã©ãŒèšèªãšQã¬ãžã¹ã¿ã§ã®æäœã䜿çšããããæŽæ°å€ããã€ãã¹ããŠãåã³ã³ããŒãã³ãã1e + 9ã®2ã€ã®éšåã«åå²ããå¿ èŠããããŸãã ãã®å Žåãä¹ç®ã¯1e + 18以äžã§ãããã¢ã»ã³ãã©ã¯ãŸã å¿ èŠãããŸãããããã»ã©é«éã§ã¯ãããŸããããååãª64ãããæŽæ°ããããC ++å ã«æ®ããŸãã åŠæ ¡ãšåã®ä¹ç®ãèŠããŠããŸããïŒ ããã§ãªãå Žåã¯ã次ã®ããšã«æ³šæããŠãã ããã
a = s a * a 1 -a 2 * 10 -9 ; b = b 1 -b 2 * 10 -9 ;
c = s c * c 1 -c 2 * 10 -9 ; d = d 1 -d 2 * 10 -9 ;
0 <= a 2 ãb 2 ãc 1,2 ãc 1,2 <10 9 ;
s aãc =èšå·ïŒaïŒãèšå·ïŒcïŒ
0 <= a 1 ãs 1 <MAX_INT64 / 10 9 9
ä¹ç®ã®èšç®ãç°¡çŽ åããããã®ãããªãã¯ã¹ãå°å ¥ããŸãã
U =ïŒa 1 ãa 2 ãb 1 ãb 2 ïŒã
V =ïŒc 1 ãc 2 ãd 1 ãd 2 ïŒ T ã
A = V * Uã
A =
| a 1 * c 1 a 1 * c 1 b 1 * c 1 b 2 * c 1 |
| a 1 * c 2 a 1 * c 2 b 1 * c 2 b 2 * c 2 |
| a 1 * d 1 a 1 * d 1 b 1 * d 1 b 2 * d 1 |
| a 1 * d 2 a 1 * d 2 b 1 * d 2 b 2 * d 2 |
ãããªãã¯ã¹ã¯ãèšç®ã容æã«ããããã§ã¯ãªããæ€èšŒã容æã«ããããã«å°å ¥ãããŠããŸãã å®éãA 11 = a 1 * c 1ã¯å³å¯ã«MAX_INT64 / 10 18æªæºã§ãªããã°ãªããã察è§ç·ã®å€ã¯æ¬¡ã®ãšããã§ããA12 = a 1 * c 2ããã³A 21 = a 2 * c 1ã¯å³å¯ã«MAX_INT64 / 109æªæºã§ãªããã°ãªããŸãããã³ã³ããŒãã³ããè¿œå ãããšãã«ãããã®ä¿æ°ãä¹ç®ããŸãã
e = A 11 * 10 18 +ïŒA 12 + A 21 ïŒ* 10 9 +ïŒA 13 + A 22 + A 31 ïŒ+ïŒA 14 + A 23 + A 32 + A 41 ïŒdiv 10 18 ã
f =ïŒA 14 + A 23 + A 32 + A 41 ïŒmod 10 18 +ïŒA 24 + A 33 + A 42 ïŒ+ïŒA 34 + A 43 ïŒdiv 10 9
ããã§ã¯ããŒãã«çãããšããçç±ã ãã§ãçšèªA 44 div 10 18ãçç¥ããŸãã ãã¡ãããåè¿œå ã®åã«ãMAX_INT64ãè¶ ããŠãããã©ããã確èªãã䟡å€ããããŸãã 幞ããªããšã«ãè¡åã®ãã¹ãŠã®ã³ã³ããŒãã³ããšäžéçµæã«å¯ŸããŠã笊å·ãªãã®åuint64_tãæäœã§ããŸãã æåŸã«è¡ãå¿ èŠãããã®ã¯ãçµæã®ç¬Šå·s e = s a xor s cã決å®ããè² ã®æ°ã®æŽæ°ãšå°æ°éšãä¿®æ£ããããšã§ããæŽæ°ã1æžãããå°æ°ã1ããæžç®ããŸãã ããã§ãäžè¬çã«ããã¹ãŠã®ä¹ç®ã§ã¯ãäž»ãªããšã¯éåžžã«æ³šæããããšã§ãã ã¢ã»ã³ãã©ã䜿çšãããšããã¹ãŠãã¯ããã«ç°¡åã«ãªããŸããããã®è³æã¯C ++ Academyã®ç¯å²ãè¶ ããŠããŸãã
ç»é²ããã³SMSã䜿çšããªãé€ç®ã¢ã«ãŽãªãºã
ååå²ã¢ã«ãŽãªãºã ãèŠããŠããã°ãããã§ããŠããŸãããããã§ã¯å¿ èŠãããŸããã æ°åŠãšäžçåŒãæã€å°ããªéè¡ã®ãããã§ãéæ°x -1ãèšç®ããx -1ã§ä¹ç®ãå®è¡ããã®ãç°¡åã«ãªããŸãã ããã§ãåé¡ã解決ããŸã
y = x -1 = 1 /ïŒa + b * 10 -18 ïŒ= c + d * 10 -18 ã
ç°¡åã«ããããã«ãæ£ã®xã®éæ°ãèŠã€ããããšãæ€èšããŠãã ããã xã®ã³ã³ããŒãã³ãã®å°ãªããšã1ã€ããŒãã«çããïŒãã ããäžåºŠã«äž¡æ¹ã§ã¯ãªãïŒå Žåãèšç®ã¯å€§å¹ ã«ç°¡çŽ åãããŸãã a = 0ã®å ŽåïŒ
y = 1 / (b * 1e-18) = 1e+18 / b, e = 1e+18 div b, f = 1e+18 mod b; b = 0, a = 1, y = e = 1, f = 0; ec b = 0, a > 1, : y = 1 / a, e = 0, f = 1e+18 div a.
ããäžè¬çãªå Žåãxã«éãŒãã®å°æ°éšãšæŽæ°éšãå«ãŸããå Žåããã®å Žåãæ¹çšåŒã¯æ¬¡ã®ããã«ãªããŸãã
a > 1, b != 0 : y = 1 / (a + b * 1e-18) < 1, e = 0, f = 1e+18 / (a + b * 1e-18).
ããã§ãæ倧次æ°10ãèŠã€ããå¿ èŠããããŸããããã¯a以äžã§ããã次ã®ã¢ã¯ã·ã§ã³ãç¹°ãè¿ãå®è¡ããŸãã
k = max(k): 1e+k <= a, u = 1e+18, v = (a * 1e+18-k + b div 1e+k); f = (u / v) * 1e+18-k, for (++k; k <=18; ++k) { u = (u % v) * 10; if (!u) break; // f += u / v * 1e+(18-k); }
ããã§ã¯ãåãä¿æ°ïŒ10ã®çŽ¯ä¹ïŒã«ããåæ°ã®ä¹ç®ãšé€ç®ã䜿çšãã次ã®10ã®çŽ¯ä¹ã«å¯Ÿããé€ç®ã®é€ç®ãšå°äœã段éçã«èšç®ããŸãã
ããããèšç®ããããšã¯å®å šã«äžèŠã§ãããäºåã«ç¥ã£ãŠããããã°ãã°å¿ èŠã«ãªãããã0ãã18ãŸã§ã®æ°å床ã®é åãæã€ããšã¯éåžžã«äŸ¿å©ã§ãã
åå€æ
ãŒããããšããæµ®åå°æ°ç¹æ°ã2åã«ããŠãçæ°ãã10é²æ°ã«å€æããã®ã«ååãªããšãããã£ãŠããŸãã
decimal::decimal(double value) : m_integral(static_cast<int64_t>(std::floor(value)) m_fractional(static_cast<int64_t>(std::floor( (value - m_integral) * 1e+18 + 0.5)) { normalize(); } void decimal::normalize() { uint64_t tail = m_fractional % 1e+3; if (tail) { if (tail > 103/2) m_fractional += 1e+3 - tail; else m_fractional -= tail; } }
ããã§ã103ã¯ãå®éã«ã¯ããããè¶ ãããšdoubleãæ£ç¢ºã§ãªããªããšã©ãŒã§ãã å¿ èŠã«å¿ããŠããšã©ãŒãããã«æžããããšãã§ããŸããããã§ã¯ ã衚瀺ãæ確ã«ããããã«10 18ã15ãå¿ èŠã§ãã ãšã«ãããå€æåŸã®æ£èŠåãå¿ èŠã«ãªããŸããæ£ç¢ºã«doubleã¯10é²æ°ã®å°æ°éšãããæããã«äœãããã§ãã ããã«ãdoubleãint64_tãè¶ ããå Žåããã®ãããªæ¡ä»¶äžã§ãå°æ°éšãæ°å€ã®æŽæ°éšãæ£ããå€æã§ããªãå Žåãèæ ®ããå¿ èŠããããŸãã
ãããŒãã®å Žåããã¹ãŠã䌌ãŠããŸããããšã©ãŒã¯æ¡éãã«å€§ãããªããŸãïŒ10 18-7 = 10 11 ã
decimal , m_integral. m_integral, m_fractional.
decimal double float :
return m_integral + m_fractional * 1e-18;
. , , , decimal separator , . «» m_precision .
, . , , , , â , .
, decimal, .
GITHUB
decimal, .
, !
, C/C++ . , Python C#, 15â18 , .
decimal , int64_t. , double float , . , decimal . , .
, . double float, , . , , , , . , !
#192.
: Qualab , ++ Parallels
ããã«ãŒã賌èªãã