求PI...精确度问题

jiakunhao1988 2011-11-15 09:10:55
#include <stdio.h>

int main()
{
double PI,d=1,a=1,b=1,c=0;
int i=0;
while(d>0.000001)
{
d=a/b;
if(i%2==0)
{
c=c+d;
}
else if(i%2!=0)
{
c=c-d;
}
b=b+2;
i++;
}
PI=4*c;
printf("%.8f\n",PI);
return 0;
}
答案应该是3.141593,为什么错了呢?
...全文
190 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
还是个小白233 2011-11-15
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <math.h>

int main(void)
{
double pi;
pi=(16*atan((double)1/5)-4*atan((double)1/239));
printf("%f",pi);
return 0;
}

这个比较简单,推荐给你
pu_xx 2011-11-15
  • 打赏
  • 举报
回复
算法是
PI=2+1/3(2+2/(2*2+1)*(2+3/(2*3+1)*(2+(.....))))))
柯本 2011-11-15
  • 打赏
  • 举报
回复
其实我也没看懂,N年前从某国外网上下的,号称是外星人写的
Gloveing 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 keiy 的回复:]

看看这个,我N久前收藏的
C/C++ code

#include <stdio.h>

long a=10000,b,c=2800,d,e,f[2801],g;
main()
{
for(;b-c;)
f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
……
[/Quote]
牛!!
解释一下原理呢?
pu_xx 2011-11-15
  • 打赏
  • 举报
回复
这是我写的算PI的程序,算法和楼上的程序一样,但容易理解多了
#include <stdio.h>
int a[1001],i,j;
int main()
{
a[0]=2000;
for(i=1000;i>0;i--){
for(j=1000;j >= 0;j--)
a[j] *= i;
for(j=999;j > 0;j--){
a[j-1] += a[j]/10000;
a[j] %= 10000;
}
for(j=0;j<1000;j++){
a[j+1] += a[j] % (i*2+1) * 10000;
a[j] /= (i*2+1);
}
a[0] += 2000;
}
for(i=0;i<250;i++)
printf("%04d",a[i]);
return 0;
}
柯本 2011-11-15
  • 打赏
  • 举报
回复
看看这个,我N久前收藏的

#include <stdio.h>

long a=10000,b,c=2800,d,e,f[2801],g;
main()
{
for(;b-c;)
f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b)
;
return 0;
}
pu_xx 2011-11-15
  • 打赏
  • 举报
回复
你对误差估计不对
PI/4=1-1/3+1/5-1/7....
当第n项<0.000001时不能保证误差小于0.000001
而且浮点数保存时有一定误差,多次运算误差积累
另外这个公式不适合用于计算PI

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧