首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pi的不同计算方法

Pi的不同计算方法
EN

Stack Overflow用户
提问于 2017-05-30 22:12:24
回答 1查看 148关注 0票数 1

我知道在代码中计算pi的两种方法。任一

pi = 4.0 * atan(1.0)

pi = acos(-1.0)

一个对另一个有什么好处?我知道有些语言有内置的pi表示,但这并不是在询问它们。此外,是否还有其他常用的计算π的方法,以及它们与其他方法的比较?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 22:37:40

一个对另一个有什么好处?

这些函数的设计并不仅仅是为了逼近π的值。在这种情况下,我看不出明显的速度。

事实上,我在我的系统上做了一个c++实验,在这个实验中,我看到两个函数的pi的近似值,以及相同的速度,或多或少。

代码语言:javascript
复制
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

代码在循环中计算π,并将循环的计数器添加到其中,确保编译器不会对其进行优化(每次迭代时值相同):

代码语言:javascript
复制
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()代码是相同的,只是函数改变了。

此外,是否还有其他常用的计算π的方法,以及它们与其他方法的比较?

还有许多其他方法来逼近π,比较它们都太宽泛了。例如,柏拉图像一样近似于π。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44272752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档