Atan(l8, 48 х TenPower) + Atan(57, 32 х TenPower) -Atan(239, 20 х TenPower)
Следующая программа использует это выражение в вычислениях:
// largepi.cpp: Используем целые числа класса large // для вычисления числа Пи.
// Скомпоновать с large.срр.
#include <fstream>
#include <time.h>
#include <stdlib.h>
#include "large.h"
Вычисление числа к
231
// Для вычисления Пи: large Atan(uint к, const large &N) { // Вычисляет N * atan(1.0/k) как // целое число класса large large a = О, w = N * к, zero = О, к2 = к * к,
i = -1,
two = 2; cout « "к = " « к « endl; while (w != zero) { a += (w /= k2)/(i += two);
a -= (w /= k2)/(i += two); }
return a; }
void PiOutput(ostream &os, ofstream &ofile,
const large &x, int n) { vector<char> s;
x.num2char(s);
// Символьное представление х находится в s
//в обратном порядке.
vector<char>::reverse_iterator i;
int k = 0;
char ch;
for (i=s.rbegin(); i != s.rendf); ++i) { ch = *i;
os << ch;
if (ofile) ofile « ch;
// После десятичной точки напечатано к цифр.
if (k == 0)
{ os « "." << endl;
if (ofile) ofile « "." « endl;
} else
if (k % 50 == 0)
{ os << endl;
if (ofile) ofile << endl;
} else
if (k % 10 == 0)
{ os « " " ;
if (ofile) ofile « " ";
if (k++ == n) break; } }
int main() { int n, m;
cout << "Computation of pi. Number of decimals: "; cin >> n; m = n + 3; cout «
"Copy of output to file pi.txt desired (y/n)? "; char answer; cin >> answer; ofstream ofile; if (answer == 'Y' I I answer == 'y')
ofile.open("pi.txt"); large TenPower, Pi; clock_t tStart, tEnd; tStart = clock(); TenPower = power(5, m); TenPower <<= m;
// Быстрее, чем TenPower = power(10, m);
Pi = (Atan(18, TenPower * 48) + Atan(57, TenPower * 32) - Atan(239, TenPower * 20))/1000;
tEnd = clock();
cout << "Digits of pi:" << endl; PiOutput(cout, ofile, Pi, n) ;
cout « "\nTime: " « (tEnd - tStart) « " ticks\n"; return 0; }
<< назад вперед >>