編程求圓周率近似值?


謝邀,下面是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語言,亂說的。


推薦閱讀:

TAG:科技 | 編程語言 | 計算機等級考試 | 面向對象程序編程 |