计算 Pi 的不同方法
calculating Pi different ways
我知道两种用代码计算圆周率的方法。
pi = 4.0 * atan(1.0)
或者
pi = acos(-1.0)
一个与另一个相比有什么好处?我知道有些语言具有内置的 pi 表示,但这并不是在询问它们。另外,是否还有其他常用的圆周率计算方法以及它们与其他方法的比较?
What is the benefit of one vs. the other?
这些函数的设计不仅仅是为了逼近 π 的值。在这种情况下,我看不到显着的速度。
事实上,我在我的系统上做了一个 c++ 实验,我看到两个函数的圆周率近似值相同,速度也差不多。
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;
}
基于我的 Time measurements (C++)。 atan()
代码是一样的,只是功能变了。
Also, are there any other common ways of calculating pi as well as how they compare to others?
还有许多其他方法可以逼近 π,将它们进行比较只是范围太广。例如,柏拉图将 π 近似为 this.
我知道两种用代码计算圆周率的方法。
pi = 4.0 * atan(1.0)
或者
pi = acos(-1.0)
一个与另一个相比有什么好处?我知道有些语言具有内置的 pi 表示,但这并不是在询问它们。另外,是否还有其他常用的圆周率计算方法以及它们与其他方法的比较?
What is the benefit of one vs. the other?
这些函数的设计不仅仅是为了逼近 π 的值。在这种情况下,我看不到显着的速度。
事实上,我在我的系统上做了一个 c++ 实验,我看到两个函数的圆周率近似值相同,速度也差不多。
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;
}
基于我的 Time measurements (C++)。 atan()
代码是一样的,只是功能变了。
Also, are there any other common ways of calculating pi as well as how they compare to others?
还有许多其他方法可以逼近 π,将它们进行比较只是范围太广。例如,柏拉图将 π 近似为 this.