Расчет Пи разными способами

Я знаю два способа вычисления пи в коде. Или

pi = 4.0 * atan(1.0)

или же

pi = acos(-1.0)

В чем выгода одного против другого? Я знаю, что есть некоторые языки со встроенным пи-представлением, но это не вопрос о них. Кроме того, есть ли другие распространенные способы вычисления пи, а также как они сравниваются с другими?

1 ответ

Решение

В чем выгода одного против другого?

Эти функции не предназначены только для аппроксимации значения π. В его случае я не вижу значительной скорости.

На самом деле, я провел эксперимент C++ на своей системе, где я вижу одинаковое приблизительное значение pi для обеих функций и одинаковую скорость, более или менее.

Georgioss-MacBook-Pro:~ gsamaras$ g++ -std=c++0x -Wall -O3 atan.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
It took me on average 1.69e-13 seconds.
3.14159265358979312
Georgioss-MacBook-Pro:~ gsamaras$ g++ -std=c++0x -Wall -O3 acos.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
It took me on average 1.7e-13 seconds.
3.14159265358979312

Код вычисляет π в цикле и добавляет к нему счетчик цикла, следя за тем, чтобы компилятор не оптимизировал его (одно и то же значение на каждой итерации):

Georgioss-MacBook-Pro:~ gsamaras$ cat acos.cpp
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
#include <cmath>
#include <limits>

#define ITER 1000000

int main ()
{
  using namespace std::chrono;

  high_resolution_clock::time_point t1 = high_resolution_clock::now();

  for(int i = 0; i < ITER; ++i)
  {
    auto pi = acos(-1.0) + i;
    pi += i + i;
  } 
  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

  std::cout << "It took me on average " << time_span.count()/(double)ITER << " seconds.";
  std::cout << std::endl;
  auto pi = acos(-1.0);
  std::cout.precision(std::numeric_limits< double >::max_digits10);
  std::cout << std::fixed << pi << std::endl;

  return 0;
}

основанный на моих измерениях времени (C++). atan() код такой же, только функция меняется.

Кроме того, есть ли другие распространенные способы вычисления пи, а также как они сравниваются с другими?

Есть много других способов аппроксимации π и сравнивать их все слишком просто. Например, Платон приблизил π как это.

Другие вопросы по тегам