¿øÁÖÀ²¥ðÀÇ °è»ê


ÇÔ¼ö¸í
pi  ¿øÁÖÀ²¥ðÀÇ °ªÀ» ´ÙÀÚ¸®¼ö·Î »êÃâÇÑ´Ù
Çü½Ä
int pi(int *data, int keta);
Àμö
data  (Ãâ·Â) ¿øÁÖÀ²ÀÇ °ªÀÌ 10Áø 4ÀÚ¸®¼ö¾¿ µé¾î°£ Á¤¼öÀÇ ¹è¿­
keta  (ÀÔ·Â) ¼Ò¼öÁ¡ ÀÌÇÏÀÇ ÀÚ¸®¼öÀÇ ÁöÁ¤
ÇÔ¼öÄ¡
Á¤»óÀûÀ¸·Î °è»êÇÒ ¼ö ÀÖ¾úÀ» ¶§¿¡ 0, ¿¡·¯ ¶§¡ª1.
ÁÖÀÇ »çÇ×

¿ë·Ê(pi-test.c )
int data[1000];
pi(data, 1000);

¥ðÀÇ °ª(¼Ò¼öÁ¡ ÀÌÇÏ1¸¸ ÀÚ¸®¼ö)

ÇÁ·Î±×·¥(pi.c )
#define LOG10_5    0.699
#define LOG10_239  2.378

int pi(int *data, int keta)
{
    int i;

    for (i = 0; i < (keta-1)/4+2; i++) data[i] = 0;
    if (series(data, keta, (int)(keta/(2*LOG10_5)+2), 4, 5, 1) ! = 0)
        return -1;
    if (series(data, keta, (int)(keta/(2*LOG10_239)+2), 1, 239, 0) ! = 0)
        return -1;
    return 0;
}

int series(int *data, int keta, int maxItem,
           unsigned bunsi, unsigned bunpo, unsigned plusMinus)
{
    unsigned bunpo2;
    unsigned *item, *itemDiv;
    unsigned *imp,  *ikp;
    int      *dap;
    int      len;
    int      i, j, k;
    long     x;

    len = (keta-1)/4+2 +1;
    if ((item = (unsigned *) calloc(len, sizeof(unsigned))) == NULL)
        return -1;
    for (imp = item, i = len; i--; ) *imp++ = 0;

    if ((itemDiv = (unsigned *) calloc(len, sizeof(unsigned))) == NULL) {
        free(item);
        return -1;
    }

    *item = bunsi * bunpo * 4;
    bunpo2 = bunpo * bunpo;

    for (j = 1; maxItem--; j += 2, plusMinus++) {
        x = 0;
        for (i = len, imp = item; i--; ) {
            x = x * 10000 + *imp;
            *imp++ = x / bunpo2;
            x %= bunpo2;
        }
        
        imp = item;
        ikp = itemDiv;
        if (j == 1) for (i = len; i--; ) *ikp++ = *imp++;
        else {
            x = 0;
            for (i = len; i--; ) {
                x = x * 10000 + *imp++;
                *ikp++ = x / j;
                x %= j;
            }
        }

        k = 0;
        dap = data + len;
        ikp = itemDiv + len;
        if (plusMinus & 1) {
            for (i = len; i--; ) {
                *--dap += *--ikp + k;
                if (*dap < 10000) k = 0;
                else {
                    *dap -= 10000;
                    k = 1;
                }
            }
        } else {
            for (i = len; i--; ) {
                *--dap -= *--ikp + k;
                if (*dap >= 0) k = 0;
                else {
                    *dap += 10000;
                    k = 1;
                }
            }
        }
    }
    free(itemDiv);
    free(item);
    return 0;
}
¼³¸í
¥ðÀÇ °ªÀ» ¿ä±¸ÇÏ·Á¸é , ¿©·¯°¡Áö ½ÄÀÌ ÀÖÁö¸¸, arctan(¿ªÅºÁ¨Æ® ÇÔ¼ö)¸¦ ¹«ÇÑ ±Þ¼ö·Î ³ªÅ¸³½ ½ÄÀÌ ÀÚÁÖ(Àß) »ç¿ëµÈ´Ù. ½ÄÀÌ ´Ü¼øÇÑ ÇüÅ·ΠÃë±ÞÇϱ⠽±°í, ¾î´À Á¤µµÀÇ ÀÚ¸®¼öÀÇ °ªÀ» ¾òÀ¸·Á¸é ÀûÇÕÇÏ´Ù. ±×·¯³ª °áÁ¡Àº, ¸Å¿ì ±ä ÀÚ¸®¼ö¸¦ ¾òÀ¸·Á¸é ½Ã°£ÀÌ ³Ê¹« °É¸®´Â °ÍÀÌ´Ù.

¿©±â¼­ »ç¿ëÇÏ´Â ½ÄÀº, °¡Àå Àß ¾Ë·ÁÁ® ÀÖ´Â, J. MachinÀÇ ½Ä
¡¡¡¡¡¡¥ð/4 = 4 arctan (1/5) - arctan (1/239)
ÀÌ´Ù. ±×´Â 1706³â¿¡ ÀÌ °ø½Ä¿¡¼­¥ð¸¦ ¼Ò¼öÁ¡ ÀÌÇÏ 100ÀÚ¸®¼ö¸¦ ¿ä±¸Çß´Ù. °°Àº °ø½Ä¿¡¼­, 1949³â¿¡´Â ENIAC¿¡ ÀÇÇØ 2037ÀÚ¸®¼ö°¡ ¾à 70½Ã°£À¸·Î, 1958 ÇØ¿¡´Â IBM704¿¡ ÀÇÇØ 1¸¸ ÀÚ¸®¼ö°¡ ¾à 100ºÐ¿¡ ¿ä±¸µÇ°í ÀÖ´Ù.

¿©·¯ºÐÀÌ »ç¿ëÇÏ´Â ÄÄÇ»ÅÍ·Î ¾î´À Á¤µµÀÇ ½Ã°£ ?

µ¡ºÙ¿©¼­, ³»°¡ »ç¿ëÇÏ°í ÀÖ´Â Pentium 120ÀÇ DOS/V¸Ó½Å¿¡¼­´Â 1¸¸ ÀÚ¸®¼ö´Â 1ºÐ ¹Ì¸¸À¸·Î °è»êÇÒ ¼ö ÀÖ¾ú´Ù. Çϵå¿þ¾îÀÇ Áøº¸´Â ´ë´ÜÇØ !

¶Ç, PC¿¡¼­ÀÇ °è»ê ±â·Ï¿¡ ´ëÇؼ­´Â, ¿ÍÄ«¸¶Ã÷µîÁö ÀÌÃ÷Å°¾¾°¡ 1990³â 2¿ù¿¡, ÈÄÁöÂê FM-TOWNS(¸Þ¸ð¸® 2 MB)¸¦ ÀÌ¿ëÇØ, 184½Ã°£ 45ºÐÀ» °ÉÃĥ𸦠100¸¸ ÀÚ¸®¼ö±îÁö °è»êÇß´Ù.

arctan¸¦¿¡ ÀÇÇÑ °íÀüÀûÀÎ °ø½ÄÀ¸·Î ±× ¹Û¿¡ ÀÌÇÏÀÇ °ÍÀÌ ÀÖ´Ù.
GaussÀÇ °ø½Ä
¡¡¡¡¡¡¥ð/4 = 12 arctan (1/18) + 8 arctan (1/57) - 5 arctan (1/239)
Å©¸®Á¨½Ã¸£³ªÀÇ °ø½Ä
¡¡¡¡¡¡¥ð/4 = 8 arctan (1/10) - arctan (1/239) - 4 arctan (1/515)
½´Å׸£¸¶ÀÇ °ø½Ä
¡¡¡¡¡¡¥ð/4 = 6 arctan (1/8) + 2 arctan (1/57) + arctan (1/239)
Ÿī³ë Å°Äí¿ÀÀÇ °ø½Ä
¡¡¡¡¡¡¥ð/4 = 12 arctan (1/49) + 32 arctan (1/57) - 5 arctan (1/239) + 12 arctan (1/110443)
½Ã¹ÙŸ ¾ÆÅ°È÷ÄÚÀÇ °ø½Ä
¡¡¡¡¡¡¥ð/4 = 17 arctan (1/22) + 3 arctan (1/172) - 2 arctan (1/682) - 7 arctan (1/5357)

½´Å׸£¸¶ÀÇ °ø½ÄÀ¸·Î 8ÀÇ ³ª´°¼ÀÀ» ±Ã¸®ÇÏ¸é °í¼ÓÈ­ ±â´ëÇÒ ¼ö ÀÖ°í, Ÿī³ëÀÇ °ø½ÄÀ» ÀÌ¿ëÇØ º´·Ä󸮸¦ Çϸé ÁÁÀº ¼ºÀûÀ» ±â´ëÇÒ ¼ö ÀÖÀÚ.

arctan¸¦ »ç¿ëÇÑ °ø½Ä¿¡¼­¥ð¸¦ °è»êÇϸé(ÀÚ), ÀÚ¸®¼ö¸¦ 2¹è·Î Çϴµ¥ °è»ê ½Ã°£ (Àº)´Â 4¹èÀÇ Áõ°¡°¡ µÇÁö¸¸, ÀÌÇÏÀÇ ¹æ¹ý¿¡¼­´Â 2.1~2.2¹è·Î ³¡³­´Ù.

Gauss¡¤¸£Àßµ¹ÀÇ °ø½Ä
¡¡¡¡¡¡A = 1, B = (1/2)1/2, T = 1/4, X = 1
(À¸)·Î¼­ A¿Í BÀÇ Â÷ÀÌ°¡ ÇÊ¿ä·Î ÇÏ´Â Á¤¹Ðµµº¸´Ù Å« µ¿¾È, ´ÙÀ½ÀÇ °è»êÀ» ¹Ýº¹ÇØ ½ÇÇàÇÑ´Ù.
¡¡¡¡¡¡Y = A, A = (A + B)/2, B = (B * Y)1/2,
¡¡¡¡¡¡T = T - X * (Y-A)2, X = 2 * X
±×·¯ÀÚ(¸é),¥ðÀÇ °ªÀº(A + B)2/(4 * T)°¡ µÈ´Ù. ´Ù¸¸, A, B, T, YÀÇ °¢ Ä¡´Â, ¿ä±¸ÇÏ·Á°í ÇÏ´Â Á¤¹Ðµµ ÀÌ»óÀ¸·Î °è»êÇØ µÑ ÇÊ¿ä°¡ ÀÖ´Ù.

°ü·Ã ÇÔ¼ö