#include<stdioh>
#include<mathh>
#include <iostream>
using namespace std;
double proc(double eps)
{
int i;
double pi=00,t=1;
for(i=1;;i++)
{
if(t>=eps)
{
pi=pi+t;
t=ti/(2i+1);
}
else break;
}
return (2pi);
}
void main()
{
double s;
printf("Enter a precision:\n");
//scanf("%f\n",&s);
cin>>s;
//printf("%f",proc(s));
cout<<proc(s);
}
算法应该没问题,我把输入输出改成了c++的形式就有输出结果了,你试一下吧 。可能是c语言的输入输出格式不支持你写的形式吧。
我只说说π是怎么近似计算出来的,大一应该学过高数,可以知道:tan π/ 4 =1,从而π=4arctan1,应用泰勒公式将arctan(x)展开,就可以得到
代入x=1得
把这展开式展开,直到最后一项的绝对值小于1e-6为止。
下面是C语言递归实现:
#include<stdioh>
#include<mathh>
void main()
{
float fuc(int n);
float s,pi;
for(int i=1;i<10000;i++)
{s=10/(2i-1);
if(s<1e-6)
break;}
pi=fuc(i);
pi=pi4;
printf ("pi=%106f\n",pi);
}
float fuc(int n)
{
float pi;
if(n==1) pi=1;
else if(n%2==0)
pi=fuc(n-1)+(-10)/(2n-1);
else pi=f(n-1)+10/(2n-1);
return(pi);
}
程序运行结果pi=3141498
希望能明白明白π的实现原理,增进你的理解。
程序说明与注释
#include<stdioh>
#include<mathh>
int main()
{
double e=01,b=05,c,d;
long int i; /i: 正多边形边数/
for(i=6;;i=2) /正多边形边数加倍/
{
d=10-sqrt(10-bb); /计算圆内接正多边形的边长/
b=05sqrt(bb+dd);
if(2ib-ie<1e-15) break; /精度达1e-15则停止计算/
e=b; /保存本次正多边形的边长作为下一次精度控制的依据/
}
printf("pai=%15lf\n",2ib); /输出π值和正多边形的边数/
printf("The number of edges of required polygon:%ld\n",i);
}
问题分析与算法设计
利用“正多边形逼近”的方法求出π值在很早以前就存在,我们的先人祖冲之就是用这种方法在世界上第一个得到精确度达小数点后第6位的π值的。
利用圆内接正六边形边长等于半径的特点将边数翻番,作出正十二边形,求出边长,重复这一过程,就可获得所需精度的π的近似值。
假设单位圆内接多边形的边长为2b,边数为i,则边数加倍后新的正多边形的边长为:
x=√——————
2-2√———
1-bb
——————
2
周长为:
y=2 i x i:为加倍前的正多边形的边数
#include<stdioh>
int main()
{
double pi=20;
double i=10;
double a= i;
double b= 2i+1;
double t=2a/b;
while(t>=1e-100)
{
pi = pi + t;
i=i+1;
a=ai;
b=b(2i+1);
t=2a/b;
}
printf("%g\n",pi);
getchar();
}
函数的原理:
pi=1 - 1/2 + 1/4 - 1/6 + 1/8 - 1/10 +
无穷多项之和就等于pi,一般算到最后一项小于一定的数值即可,那就是精度,程序中的2e-6,当然也可以用1e-6或者1e-8等。
以上就是关于看一下这个求pi的C程序全部的内容,包括:看一下这个求pi的C程序、C语言编程计算出π的值 最好有三种方法!! 急求 好人一生平安啊、用C语言编个程序,求π(派)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)