// +++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++ 自然対数の底e と 円周率π を求めるプログラム +++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++ // // original maked by Y.S. // transfered(fortran to C) by G-HAL // 1995 / 09 / 16 // transfered(C to C++) by G-HAL // 1995 / 09 / 17 // transfered(DECIMAL to BINALY) by G-HAL // 1995 / 09 / 17 - 1995 / 09 / 18 // 1995 / 11 / 26 // 1995 / 11 / 27 // // 参考資料 // Y.S. の宿題のレポート // (アルゴリズム全部) // bit vol.20,No.10 パソコンによる円周率πの計算 // 1000桁1秒をめざして // 高澤 よしみつ(字が出ない) // (cLENGTH = LEN*10/48+1 だけ) // // (サブルーチンはオリジナル) #include "EPPP_C.h" #include #include LONGNUM::LONGNUM(void) { LENGTH = 0; cLENGTH = 0; cLENGTHs = 0; return; } signed int LONGNUM::INIT(signed long LEN) { signed long t; LENGTH = LEN; t = LEN; cLENGTH = (t*10/48+2)*2; cLENGTHs = cLENGTH / sizeof(short); t = cLENGTH; ACCURACY = ((t+2)*24-96)/10-1; if( !(NUM = (unsigned short *)calloc( cLENGTH+2, sizeof(char))) ) { LENGTH = 0; cLENGTH = 0; cLENGTHs = 0; return(-1); } return(0); } /* LONGNUM::~LONGNUM(void) { free(NUM); LENGTH = 0; cLENGTH = 0; cLENGTHs = 0; return; } */ void LONGNUM::KETA(class LONGNUM x) { unsigned long t; unsigned long I; unsigned char *bNUM; bNUM = (unsigned char *)x.NUM; for(I=0; (I < cLENGTH+2) && (bNUM[I] == 0); I++); t = I; x.ACCURACY = (t*24-96)/10-1; if(x.ACCURACY < ACCURACY) ACCURACY = x.ACCURACY; printf("%lu\n", ACCURACY); return; } void LONGNUM::HYOUZI(class LONGNUM t1, class LONGNUM t2) { unsigned long I; signed char t; t1.NUM = NUM; t = t1.NUM[0]; t1.NUM[0] -= t; printf( "%d.", t); for( I=1; I>=(const unsigned char A) { signed long I; unsigned long t1 = 0, t2 = 0; for( I=0; I<=cLENGTHs; I++) { t1 = NUM[I]; t1 <<= (16-A); t1 |= t2; NUM[I] = (unsigned short)(t1 >> 16); t2 = t1 << 16; } return; }