В результате много­точие в выражении (4) обозначает конечное количество членов N/(W), поэтому мы можем вычислить все эти значения. После этого из формулы (1) следует, что TenPower x к приблизительно равняется следующему боль­шому числу:

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; }


<< назад вперед >>