編程求圓周率近似值?
謝邀,下面是C++的圓周率示例,寫完測試可用,僅供參考。
/*
* @Author: suifengtec
* @Date: 2017-10-20 11:11:27
* @Last Modified by: suifengtec
* @Last Modified time: 2017-10-20 11:39:09
**/
/*
g++ -std=c++0x -o a.exe main.cpp && a
π/4 = 1- 1/3 + 1/5 - 1/7 +...
*/
#include <iostream>
#include <iomanip>
namespace giveMePai {
template <typename T> inline T calc_pi() {
T sum=T(0), k8=T(0), fac=T(1);
for(;;) {
const T next =
sum + fac*(T(4)/(k8+T(1))-T(2)/(k8+T(4))-T(1)/(k8+T(5))-T(1)/(k8+T(6)));
if(sum == next) return sum;
sum=next;
fac /= T(16);
k8 += T(8);
}
}
static const auto PI = calc_pi<double>();
}
/*你想用的方法*/
double pi(int n) {
double sum = 0.0;
int sign = 1;
for (int i = 0; i < n; ++i) {
sum += sign/(2.0*i+1.0);
sign *= -1;
}
return 4.0*sum;
}
using namespace std;
using namespace giveMePai;
int main(void)
{
/*你想用的方法*/
cout << pi(1000000) <<endl;
/*稍微有逼格和精確的實現*/
/*cout << std::setprecision(100) << giveMePai::PI <<endl;*/
return 0;
}
如果相求任意位,請搜索下梅欽公式,我在那個百科詞條實現了一個 JS 版的求任意位 π 值的方法。
對C一竅不通你還問我。下面我說的你覺得不妥就當我沒說。你的n=n+2,寫在條件里,是否在執行sum=……的賦值語句前,如果這樣的話,以第一次執行為例,當執行到sum=……時,n其實已經是3,試試把n=n+2放到sum=……後面,後者乾脆不要申明n,1/n用1/(2*i+1)代替。
還有sum=……部分應該擴到循環裡面,是循環要執行的語句,pi=sum*4就不要放循環裡面了,用循環完成後的sum賦值給pi就行,否則這句循環一部運算一次,影響速度。
最後再說一句,我沒玩過c語言,亂說的。
推薦閱讀: