You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.4 KiB
77 lines
2.4 KiB
// Compute decimal Archimedes' constant Pi to arbitrary accuracy.
|
|
|
|
#include <cln/output.h>
|
|
#include <cln/real.h>
|
|
#include <cln/real_io.h>
|
|
#include <cctype>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <sstream>
|
|
|
|
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<char> i = buf.rdbuf();
|
|
while (--digits+2>0)
|
|
cout << *(i++);
|
|
}
|
|
cout << endl;
|
|
|
|
return 0;
|
|
}
|