中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【厉害】纯批计算圆周率,精确到小数点100位
« [1] [2] [3] »
作者:
标题: 【厉害】纯批计算圆周率,精确到小数点100位 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【厉害】纯批计算圆周率,精确到小数点100位

给大家出了个题目^_^,比较难,

没有任何实用价值,只为提供挑战平台。

[ Last edited by plp626 on 2009-11-30 at 14:33 ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-30 11:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 2 楼』:  

好久没来现在附代码如下:此贴已结!
@echo off&title 计算圆周率 by plp626@cn-dos.net
setlocal enabledelayedexpansion
if not %1.==. (set c=%1) else set c=100
set/a c=(c*100/3)+70,cc=c/10,count=0
for /l %%a in (1 1 %cc%)do set/a f_%%a=2000
for /l %%a in (%c% -132 100)do (set/a n=%%a/10,m=2*n-1
set/a "d=f_!n!*10000,f_!b!=d%%m,d=d/m,n-=1"
for /l %%b in (!n! -1 1)do (set/a n=%%b,m=2*n-1
   set/a "d=d*n+f_!n!*10000,f_!n!=d%%m,d=d/m,n-=1"
)
set/a "an=e+d/10000,e=d%%10000"
if !an! lss 1000 set an=000!an!
set/p=!an:~-4!<nul
)
echo\&echo/&set/p=数学爱好者加我QQ:************,
[ Last edited by plp626 on 2010-10-5 at 15:31 ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-30 13:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 3 楼』:  

说实话,我不知道圆周率是怎样计算的^_^



2008-4-30 13:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 4 楼』:  

呵呵,我也不知道。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-4-30 14:09
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  

其实,没有所谓的纯批处理,所谓的纯只是限定用系统内置的命令(包括外部命令)。所以,只要将相关的外部命令(例如汇编程序)用批处理写入磁盘,然后调用,也就是纯批处理。这个应该不是很难吧?

[ Last edited by Climbing on 2008-4-30 at 02:12 PM ]



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-4-30 14:11
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 6 楼』:  

......

[ Last edited by plp626 on 2008-5-1 at 06:45 PM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-30 14:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by Climbing at 2008-4-30 02:11 PM:
其实,没有所谓的纯批处理,所谓的纯只是限定用系统内置的命令(包括外部命令)。所以,只要将相关的外部命令(例如汇编程序)用批处理写入磁 ...

那个可能更复杂了,你不觉得吗?set位运行,/a参数不是现成的工具吗?



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-30 14:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  

大学里的微积分知识全都还给老师了,看到就头晕。

2008-4-30 14:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ansipeter
中级用户

替身



积分 269
发帖 130
注册 2007-3-23
状态 离线
『第 9 楼』:  

我都不知道圆周率是什么东西,小的中学毕业,唉,惭愧



*讨厌的9527*  
2008-4-30 15:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 10 楼』:  

网上找到的一段VBS的圆周率计算说明

  Quote:
Atn 函数返回数值的反正切值。

Atn(number)

number 参数可以是任意有效的数值表达式。

说明
Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧度值。此比值是该角对边的长度与邻边长度之比。 结果的范围是从 -pi/2 到 pi/2 弧度。

弧度变换为角度的方法是将弧度乘以 pi/180。反之,角度变换为弧度的方法是将角度乘以180/pi 。

下面的示例利用 Atn 来计算 pi 的值:

Dim pipi = 4 * Atn(1)   ' 计算 pi 的值。注意 Atn 是 Tan(将角作为参数返回直角三角形两边的比值)的反三角函数。不要混淆 Atn 与余切(正切的倒数 (1/tangent))函数。

这是一段计算圆周率的VBS,不过很费时,我的机子花了30多秒才计算了6位(Abs(t) > 0.0000001,小数点后有多少个0,就精确到多少位)
k = 1: s = 1: t = 1: m = 1
time_ = timer
While Abs(t) > 0.0000001
k = k + 2  
m = -m  
t = m / k  
s = s + t  
Wend
tt = timer - time_
MsgBox tt & vbCrLf & "圆周率π=" & 4 * s




2008-4-30 15:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 11 楼』:  

C 语言的:
这个强悍,一瞬间(不到1秒)输出800位(已更正):
#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);
}
原帖:http://wangcong.org/articles/puzzle.html

(上面代码和这个一样)这个大家能看懂(用的就是方案2):
#include < stdio.h>
long b, c=2800, d, e, f[2801];
main(){
    while(b-c!=0){
        f[b]=2000;
        b++;
        }

    while(c!=0){
        b=c;
        d=f[b]*10000;
        f[b]=d%(b*2-1);
        d=d/(b*2-1);
        --b;
        while(b!=0){
            d=d*b+f[b]*10000;
            f[b]=d%(b*2-1);
            d=d/(b*2-1);
            --b;
            }
        c-=14;
        printf("%.4d",e+d/10000);
        e=d%10000;
        }
    }
要真想算100位小数就得有好算法,即使高级语言也不例外,C能提供的实型数据最高精度也才19位(查书),这个代码是把每步除法的的余数存放在数组里,保证不会有截断误差,
那这么看来,只要P能实现任意位数, 的两个整数除法,我们就可以用第二个方案算出Pi.
-------------------------------------------------
baidu批处理吧搜的分数化小数(或循环小数即任意精度),对分子分母不超过2^30的分数可行:

http://tieba.baidu.com/f?ct=3356 ... A6%C0%ED#1180921912

咱论坛不得不爱版主有个算整数除法的代码,支持被除数任意位数,除数不超过8位数的(102楼):

http://www.cn-dos.net/forum/view ... E5%A4%96&page=7

似乎达到我们的要求?

[ Last edited by plp626 on 2008-4-30 at 05:04 PM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-30 16:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 12 楼』:  

C 语言的:
这个强悍,一瞬间(不到1秒)输出2800位:


代码不知道你调试了没?反正看着是有错误。代码输出的是余数?貌似全是0
for的那部分有错误。。

如果对的话,还想改成VBS看看速度呢。



zh159的VBS不要用while,直接用for i=0 to 1000000....next

这个才3秒多就14位了。

改大点就好了。

不过……貌似还是14位……还是数据类型不好呀。

2008-4-30 16:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BWSkyer
中级用户

我是DOS学者


积分 367
发帖 180
注册 2006-5-14
来自 重庆
状态 离线
『第 13 楼』:  

沒有看懂, 大學就沒有去學微積分~~~



My blog:左铅右椠 上善若水
My team: 519创意团队
2008-4-30 16:38
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (309843581)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by slore at 2008-4-30 04:35 PM:
C 语言的:
这个强悍,一瞬间(不到1秒)输出2800位:


代码不知道你调试了没?反正看着是有错误。代码输出的是余数?貌似全是0
for的那部分有 ...

调试了,有源代码,exe文件在此。
http://upload.cn-dos.net/img/345.rar

你没加头文件#include <stdio.h>?

我粘贴有点匆忙,现在补上了。

[ Last edited by plp626 on 2008-4-30 at 05:16 PM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-30 16:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 15 楼』:  

你看FOR语句就不对^b   f[b]

不过找到了代码了。
#include <stdio.h>

long a=10000,b,c=2800,d,e,f[2801],g;
void main()
{
for(;b-c;)
f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%04d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
}

但是这个是(2800/14)*4位……

2008-4-30 16:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: