Board logo

标题: [数值计算] 批处理计算圆周率的三个方案 [打印本页]

作者: CrLf    时间: 2013-2-4 17:52     标题: 批处理计算圆周率的三个方案

本帖最后由 CrLf 于 2016-3-16 22:12 编辑

1、基于公式 pi=4-4/3+4/5-4/7+4/9-4/11+4/13-4/15 ...
逛贴吧看到有人在讨论圆周率计算
这是那贴子中顶楼的方案,该算法简单易行但是效率太低,随着精度增长,所需的循环次数将以指数级暴涨,改写后:
  1. @echo off
  2. set det=1
  3. for /l %%a in (1 2 100000) do set /a "pi+=400000000/%%a*det,det=-det"
  4. echo 近似值为 %pi%
  5. pause
复制代码
2、计算相切圆的落点
方案一提到的帖子中有人跟帖提到计算正方形内所有位于相切圆的落点数量来暴力计算pi,优点是容易理解,缺点也是级数太大导致运行慢,而且只能计算到小数点后 3 位:
  1. @echo off
  2. rem 不需要计算整个圆的落点,只需要计算八分之一圆(45°)*8 并补上圆心即可:
  3. set /a r=100,rp=r*r,n=1-r*4
  4. for /l %%x in (1 1 %r%) do (
  5. for /l %%y in (0 1 %%x) do (
  6. set /a "a=rp-%%x*%%x-%%y*%%y,n+=!(a>>31)*8"
  7. )
  8. set /a "a=rp-%%x*%%x*2,n-=!(a>>31)*4"
  9. )
  10. set /a pi=n*1000/rp
  11. set /a x1*=4,n*=4
  12. echo 近似值为 %pi%
  13. pause
复制代码
3、基于公式:pi=2*1+2*1!/3!!+2*2!/5!!+2*3!/7!!+...+2*k!/(2*k+1)!!+...
在论坛里搜到这个帖子:批处理计算圆周率任意位
当中某链接内容提到计算圆周率的c语言原形(见附),改写成批处理后顺便针对批处理脚本的特性作了一些优化,效率自然还是远不能和 exe 相比的了
  1. @echo off&setlocal enabledelayedexpansion
  2. echo %time%
  3. set /a a=10000,c=100
  4. ::此处的 c=100 代表精度为 100 位,以 4 位精度为一截向下取整,即 99 等效于 96
  5. (set /a "a/=5,c=c/4*14-1"
  6. for /l %%a in (1 1 !c!) do set f[%%a]=!a!
  7. for /l %%i in (!c! -14 0) do (
  8. for /l %%j in (%%i -1 1) do (
  9. set /a d+=f[%%j]*%a%,f[%%j]=d%%(%%j*2+1^),d=d/(%%j*2+1^)*%%j
  10. )
  11. set /a c=a+d/%a%,a=d%%%a%+%a%,d=0
  12. set /p=!c:~-4!
  13. )
  14. )<nul
  15. echo;&echo %time%
  16. pause
复制代码
附:
c语言原形
  1. long a=10000,b,c=2800,d,e,f[2801],g;
  2. main(){for(;b-c;)f[b++]=a/5;
  3. for(;d=0,g=c*2;c -=14,printf("%.4d",e+d/a),e=d%a)
  4. for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b);}
  5. //用到的级数是pi/2= sum{k!/(2*k-1)!!,k=0,1,2,...}
复制代码
除了这三个方案肯定还有其他的办法,就懒得费脑子一一写出了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2