以下是一个经典的大整数 PI 值计算程序。
程序代码:
#include <stdio.h> #include <stdlib.h> #include <windows.h> const int LONG_TIME = 4000; char *p; char *t; int q; void l_add() { int j; for ( j = q; j >= 0; j-- ) { if ( t[j] + p[j] > 9 ) { p[j] += t[j] - 10; p[j - 1] += 1; } else p[j] += t[j]; } } void l_sub() { int j; for ( j = q; j >= 0; j-- ) { if ( p[j] < t[j] ) { p[j] -= t[j] - 10; p[j - 1] -= 1; } else p[j] -= t[j]; } } void l_mul( int multiplier ) { int b; int i; int carry = 0, digit = 0; for ( i = q; i >= 0; i-- ) { b = ( t[i] * multiplier + carry ); digit = b % 10; carry = b / 10; t[i] = digit; } } /* t[] /= l */ void l_div( int divisor ) { int i, b; int quotient, remainder = 0; for ( i = 0; i <= q; i++ ) { b = ( 10 * remainder + t[i] ); quotient = b / divisor; remainder = b % divisor; t[i] = quotient; } } void div4() { int i, c, d = 0; for ( i = 0; i <= q; i++ ) { c = ( 10 * d + p[i] ) / 4; d = ( 10 * d + p[i] ) % 4; p[i] = c; } } void mul4() { int i, c, d; d = c = 0; for ( i = q; i >= 0; i-- ) { d = ( p[i] * 4 + c ) % 10; c = ( p[i] * 4 + c ) / 10; p[i] = d; } } int tiszero() { int k; for ( k = 0; k <= q; k++ ) if ( t[k] != 0 ) return FALSE; return TRUE; } void l_arctan( int s ) { int n; t[0] = 1; l_div( s ); /* t[] = 1/s */ l_add(); n = 1; do { l_mul( n ); l_div( s * s ); l_div( n += 2 ); if ( ( ( n - 1 ) / 2 ) % 2 == 0 ) l_add(); else l_sub(); } while ( !tiszero() ); } int main( int argc, char *argv[] ) { DWORD startime, endtime; int i; if ( argc == 2 ) { q = atoi( argv[1] ); } else { printf( "Usage: pi [precision]" ); return 1; } if ( q < 0 ) { printf( "Precision was too low, running with precision of 0." ); q = 0; } if ( q > LONG_TIME ) { printf( "Be prepared to wait a while..." ); } // Compute one more digit than we display to compensate for rounding q++; p = malloc( q + 1 ); t = malloc( q + 1 ); if ( !p || !t ) { printf( "Cannot allocate memory\n" ); return 2; } memset( p, 0, q + 1 ); memset( t, 0, q + 1 ); /* compute pi */ startime = GetTickCount(); l_arctan( 2 ); l_arctan( 3 ); mul4(); endtime = GetTickCount(); // Return to the number of digits we want to display q--; /* print pi */ printf( "pi = %d.", p[0] ); for ( i = 1; i <= q; i++ ) printf( "%d", p[i] ); printf( "\n%d ms to compute pi with a precision of %d digits.", endtime - startime, q ); return 0; }