ããã°ã©ãã³ã°æã«æ³¨æãã¹ãç¹ã®ä¸ã¤ã«ï¼è¨ç®ç²¾åº¦ã®åé¡ãããã¾ãï¼
ãã¨ãã°C/C++ã ã¨ï¼doubleã§è¨ç®ãã¦ãæå¹æ¡æ°ã¯15æ¡ç¨åº¦(10é²æ°ã§)ããããã¾ããï¼ãã®çµæï¼ä»¥ä¸ã®ãããªç¶æ³ã§ééã£ãè¨ç®çµæãåºã¦ãã¾ãã¾ãï¼
- åãæ±ãæ°å¤ã15æ¡ãè¶ããå ´å
- åãæ±ãæ°å¤ã7æ¡ãè¶ããå ´å
- ãã¨ãã°8æ¡å士ã®æãç®ãè¡ãããã¨ãã®çµæã¯æ大16æ¡ã«ãªãã¾ãï¼doubleåã®å¤æ°ã«ã¯15æ¡ç¨åº¦ã®æ å ±ããä¿åã§ããªãã®ã§ï¼ä¸ä½1æ¡ã®æ å ±ã¯æ£ã¦ããã¾ãï¼
- åãæ±ãæ°å¤ã®æ大å¤ã¨æå°å¤ã«ï¼15æ¡ã®ä»¥ä¸ã®å·®ãããå ´å
- ãã¨ãã°Cè¨èªã®doubleåã§(1.0 + 1e-16)ãè¨ç®ããã¨çµæ㯠1.0 ã«ãªãã¾ãï¼
ãããè¨ç®ç²¾åº¦ã®åé¡ãé¿ããæ¹æ³ã®ä¸ã¤ã«GMPã¨ããã©ã¤ãã©ãªã使ãæ¹æ³ãããã¾ãã以ä¸ãã¤ã³ããã¾ã¨ãã¾ãã
GMPã¨ã¯
GMP(GNU Multiple Precision library)ã¨ã¯ä»»æ精度è¨ç®ã©ã¤ãã©ãªã®ä¸ã¤ã§ããGMPã使ãã¨ãå¤æ°åä½ã§ç²¾åº¦ãæå®ãããã¨ãã§ããä¸è¨ã®ãããªè¨ç®ç²¾åº¦ã®åé¡ã解決ã§ãã¾ãã
ã½ã¼ã¹ã³ã¼ããããã¥ã¡ã³ãç㯠http://gmplib.org/ ã§å ¬éããã¦ãã¾ãã
ãµã³ãã«ã³ã¼ãã¨ã³ã³ãã¤ã«æ¹æ³
ãã¨ãã°ä»¥ä¸ã®ãµã³ãã«ã³ã¼ãã¯ã
$ gcc -lgmp hoge.c -o hoge
ã§ã³ã³ãã¤ã«ã§ãã¾ãã
#include <stdio.h> #include <gmp.h> #define BASE 10 int main() { mpz_t a; mpz_init(a); mpz_set_str(a, "12345678901234567890", BASE); mpz_out_str (stdout, BASE, a); printf("\n"); mpz_clear(a); return 0; }
APIã®æ¦è¦
å¤æ°ã®å
GMPã§ã¯ãæ°å¤ãæ ¼ç´ããå¤æ°åã¨ãã¦
- æ´æ°å mpz_t
- æµ®åå°æ°ç¹æ°å mpf_t
- æçæ°å mpq_t
ã®ï¼ã¤ãç¨æãã¦ãã¾ãï¼
å¤æ°ã®åæå
å¤æ°ã¯åæåãå¿ è¦ã§ãï¼
mpz_t num; mpz_init(num);
ã¾ãã精度ãæ示ããå ´åã¯
mpz_t num;
mpz_init2(num, 512);
ã¨ãã¾ãããã®å ´å512bitåã®ç²¾åº¦ãä¿è¨¼ããã¾ãã
å¤æ°ã¸ã®æ°å¤ã®ä»£å ¥
ä»£å ¥ããéã¯ï¼æ°å¤ãæååã§æå®ãã¾ãï¼(æååãªã®ã§ä½æ¡ã®æ°å¤ã§ãæå®ã§ãã¾ã)
ãã¨ãã°10é²æ°ã®"12345"ã num ã«ä¿åããå ´åã¯æ¬¡ã®ããã«æ¸ãã¾ãã
mpz_t num; mpz_init(num); mpz_set_str(num, "12345", 10);
æ°å¤è¨ç®
大æµã®æ¼ç®ã¯å®ç¾©æ¸ã§ãã
- mpz_add(z,x,y) z = x+y
- mpz_sub(z,x,y) z = x-y
- mpz_mul(z,x,y) z = x*y
é¢æ°ä¸è¦§ã¯ GNU MP 6.1.2: Function Index ã«ããã¾ãã
å¤ã®è¡¨ç¤º
å¤æ° num ã®å¤ã 10é²æ°ã§ stdout ã«åºåããå ´åã¯ä»¥ä¸ã®ããã«è¨è¿°ãã¾ã
mpz_out_str(stdout, 10, num);