// Compute decimal Archimedes' constant Pi to arbitrary accuracy. #include #include #include #include #include #include #include using namespace std; using namespace cln; static void usage (ostream &os) { os << "Usage: pi [digits]\n"; os << "Compute decimal Archimedes' constant Pi to arbitrary accuracy.\n\n"; os << " --help display this help and exit\n"; os << " --version output version information and exit\n"; os << " --bibliography output recommended readings and exit\n"; } int main (int argc, char * argv[]) { long digits = 100; if (argc > 1) { if (argc == 2 && !strcmp(argv[1],"--help")) { usage(cout); return 0; } if (argc == 2 && !strcmp(argv[1],"--version")) { cout << "pi (cln) " << CL_VERSION_MAJOR << "." << CL_VERSION_MINOR << endl; cout << "Written by Bruno Haible." << endl; cout << endl; cout << "Copyright (C) 1998-2008 Bruno Haible, 2000-2008 Richard B. Kreckel." << endl; cout << "This is free software; see the source for copying conditions. There is NO" << endl; cout << "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." << endl; cout << endl; return 0; } if (argc == 2 && !strcmp(argv[1],"--bibliography")) { cout << "Recommended readings:\n"; cout << "\"Pi\", by Joerg Arndt and Christoph Haenel (1999)\n"; cout << "\"Pi: A Source Book\" by Lennart Berggren, Jonathan Borwein, Peter Borwein (1997)" << endl; return 0; } if (argc == 2 && isdigit(argv[1][0])) { digits = atol(argv[1]); } else { usage(cerr); return 1; } } if (digits) { cl_F p = pi(float_format(digits)); // make CLN believe this number has default_float_format to suppress // exponent marker which would be quite boring for 3.1416... cl_print_flags cpf; cpf.default_float_format = float_format(p); // We cannot print directly because people get dazed and confused // when they see gratuitous digits (Debian Bug #286266.) And we // must not "fix" the output routine because print-read consistency // is at stake. As a workaround, print into a buffer so we can chop // off characters from its end. stringstream buf; print_real(buf, cpf, p); istreambuf_iterator i = buf.rdbuf(); while (--digits+2>0) cout << *(i++); } cout << endl; return 0; }