24小时热门版块排行榜    

查看: 1866  |  回复: 10

836449366

金虫 (小有名气)

[求助] 计算圆周率得到的结果错误 已有3人参与

我的程序是计算圆周率,原理是:在一个1*1的正方形及其内切圆(圆心为(0.5,0.5))中,随机数x和随机数y组成的点位于正方形内,但要判断这个点是否也在圆内,当点数很多时,圆内的点数除以总数再乘以4就等于圆周率了(即面积之比),我所编写的程序如下:
      program main
      implicit none
      integer*4 :: i,j,ii,n
      integer*8 :: num
      real*4 :: r
      real*4,allocatable :: x(,y(

      do 100 n=9,12,1
       num=10**(n)
!      num=100000
      allocate(x(num))
      allocate(y(num))
      call random_seed()
      call random_number(x)
      call random_number(y)

      ii = 0
      do i = 1,num
          r = sqrt((x(i)-0.5)**2 + (y(i)-0.5)**2)
          if(r .le. 0.5) then
              ii = ii+1
          end if
      end do
      write(*,"(a,F20.15,D10.2)" "pai=",4.0*ii/num,num*1.0
      deallocate(x,y)

100   continue
      end
运行之后,得到的结果为
pai=   3.141531944274902  0.10D+10               
pai=   3.141597270965576  0.14D+10
pai=   3.141620874404907  0.12D+10
pai=   0.000000000000000 -0.73D+09
对于得到的结果,只有第一个是正确的,后几个都错了,我想问的是我这个程序到底错在哪?怎样进行修改?
(当设置n=5-9时,得到的结果是正确的)
求帮忙!谢谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

laohuajiang

至尊木虫 (职业作家)

老花匠

【答案】应助回帖

另外,因为有下面一句
do i = 1,num
i的类型应与num一致,都改成integer*8

还有integer*4,integer*8的范围是多少,能装下10^12?

稍微改一下,仅供参考。


program main
      implicit none
      integer*8 :: i,j,ii,n
      integer*8 :: num
      real*4 :: r
      real*4:: x,y

                do 100 n=9,12,1
                num=10**(n)
                call random_seed()

                ii = 0
                do i = 1,num
                        call random_number(x)
                        call random_number(y)
                        r = sqrt((x-0.5)**2 + (y-0.5)**2)
                        if(r .le. 0.5) then
              ii = ii+1
          end if
                end do
                write(*,"(a,F20.15,D10.2)","pai=",4.0*ii/num,num*1.0


                100   continue
      end

» 本帖已获得的红花(最新10朵)

静坐常思自己过,闲谈莫论他人非!---老花匠(老非老-春残意彷徨;花非花-芳踪觅繁华,匠非匠-最美难得糊涂!)
4楼2013-12-26 23:49:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

laohuajiang

至尊木虫 (职业作家)

老花匠

【答案】应助回帖

感谢参与,应助指数 +1
那些随机数不必存起来,只设一二个当作坐标。生成一个,计算一个。
当n>9时出错的原因,很可以也在这,10^9毕竟太大了。
静坐常思自己过,闲谈莫论他人非!---老花匠(老非老-春残意彷徨;花非花-芳踪觅繁华,匠非匠-最美难得糊涂!)
2楼2013-12-26 23:32:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Chlo_Q

木虫 (著名写手)

【答案】应助回帖

感谢参与,应助指数 +1
这是什么语言…
只懂basic和c语言的飘过…
数学原理我懂
先设n,m为整数,初始值均为0
设置一个循环,当n大于100000000时停止
n=n+1
随机出一组0~1但不包括0、1的数组x,y,之后判断sqrt((x-0.5)^2+(y-0.5)^2)是否小于0.5,如是,m=m+1
下一个循环
跳出循环后,pai=4*m/n
你对一下你的代码
首先,我觉得你的样本量太少了…这种概率性的计算,要设样本量多一点,反正计算机那么快…

[ 发自手机版 http://muchong.com/3g ]
你的理想是什么?你能为你的理想做什么?为了你的理想你能放弃什么?
3楼2013-12-26 23:42:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ju5200

木虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
836449366: 金币+10, ★★★很有帮助 2013-12-27 17:08:34
只懂matlab 给你试了一下
n=10000000;
z=[];
zn=0;
tempta=[];
x=rand(n,1);
y=rand(n,1);
tempta=sqrt((x-0.5).^2+(y-0.5).^2);
z=find(tempta<0.5);
zn=length(z);
pai=zn/n/0.25


结果:pai =
   3.142021200000000
5楼2013-12-27 10:27:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

836449366

金虫 (小有名气)

引用回帖:
5楼: Originally posted by ju5200 at 2013-12-27 10:27:52
只懂matlab 给你试了一下
n=10000000;
z=[];
zn=0;
tempta=[];
x=rand(n,1);
y=rand(n,1);
tempta=sqrt((x-0.5).^2+(y-0.5).^2);
z=find(tempta<0.5);
zn=length(z);
pai=zn/n/0.25


结果:pai =
...

非常感谢,我运行之后的结果只有小数点四位数,怎么样加大小数点数?还用,加大n,就会发生错误,怎样解决?
6楼2013-12-27 17:11:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

836449366

金虫 (小有名气)

送红花一朵
引用回帖:
4楼: Originally posted by laohuajiang at 2013-12-26 23:49:40
另外,因为有下面一句
do i = 1,num
i的类型应与num一致,都改成integer*8

还有integer*4,integer*8的范围是多少,能装下10^12?

稍微改一下,仅供参考。


program main
      implicit none
      i ...

运行你的程序,得到的结果正确
pai=   3.141503810882568  0.10D+10
pai=   3.141577005386353  0.10D+11
pai=   3.141593694686890  0.10D+12
不过,计算的结果太慢了,计算机应该对这种单一运算应该很快的吧,怎么这么慢?
7楼2013-12-27 17:14:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ju5200

木虫 (正式写手)

引用回帖:
6楼: Originally posted by 836449366 at 2013-12-27 17:11:55
非常感谢,我运行之后的结果只有小数点四位数,怎么样加大小数点数?还用,加大n,就会发生错误,怎样解决?...

在前面声明一下数据精度即可,第一行加上format long;
ps:感觉这种算圆周率的方法本身会有问题,算出来的结果不太精确

[ 发自小木虫客户端 ]
8楼2013-12-27 18:00:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

你这 Fortran 是从哪里学来的,居然还 integer*4, real*4……

一定要用符合标准定义的写法…………
9楼2014-02-07 14:07:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

836449366

金虫 (小有名气)

引用回帖:
9楼: Originally posted by snoopyzhao at 2014-02-07 14:07:12
你这 Fortran 是从哪里学来的,居然还 integer*4, real*4……

一定要用符合标准定义的写法…………

可以这样写,这样也是符合标准定义的写法
10楼2014-02-10 15:04:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 836449366 的主题更新
信息提示
请填处理意见