模拟:
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int cnt,jd; 5 int main () { 6 jd=10000; 7 for (int x=1;x<=jd;x++) 8 for (int y=1;y<=jd;y++) 9 if (sqrt(x*x+y*y)<=jd) cnt++; 10 cout<<((cnt-jd)*4+1)*1.0/jd/jd; 11 return 0; 12 }
随着 jd 不断加大,输出不断逼近 3.14159
华二 沈思贤提供
利用反余弦函数
1 include <bits/stdc++.h> 2 using namespace std; 3 int main() { 4 cout<<fixed<<setprecision(50)<<acos(-1); 5 return 0; 6 }
反余弦函数精度限制最多48位
利用莱布尼茨无穷级数
π/4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - …
1 #include<cstdio> 2 using namespace std; 3 double pi; 4 long long fm=1; //分母每次加 2,这里要定义为 long long 5 int fh=1; 6 int main() { 7 //freopen("pi.txt","w",stdout); 8 for (long long i=1;i<=2147483647;i++) { //奇怪的是i若定义为int类型,循环出不来 9 pi+=1.0/fm*fh; 10 fm+=2; 11 fh*=-1; 12 //printf("%d %.20f\n",i,pi*4); 13 } 14 printf("%.20f\n",pi*4); //9.5秒出结果 15 return 0; 16 }
尼拉坎特哈级数
PS:大约60000多项之后精度开始有偏差
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 double pi=3; 5 long long a=2,b=3,c=4; 6 int fh=1; 7 int main() { 8 for (int i=1;;i++) { 9 pi=pi+fh*4.0/(a*b*c); 10 fh=fh*-1; 11 a=a+2;b=b+2;c=c+2; 12 cout<<i<<' '<<fixed<<setprecision(20)<<pi<<endl; 13 } 14 return 0; 15 }