中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-13 19:24
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【厉害】纯批计算圆周率,精确到小数点100位
16 发表于 2008-04-30 17:11 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
这个VBS的很快,不过受VBS限制位数
n=100
for i = 1 to n
str=2+(n+1-i)/((n+1-i)*2+1)*str
next
msgbox str


如果转为批处理则为:
@echo off
setlocal EnableDelayedExpansion
set str=1
for /l %%i in (100,1,1) do set/a str=2+%%i/(%%i*2+1)*!str!
echo %str%
pause

可惜set/a不能计算小数
17 发表于 2008-04-30 17:25 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
Originally posted by zh159 at 2008-4-30 05:11 PM:
这个VBS的很快,不过受VBS限制位数
n=100
for i = 1 to n
str=2+(n+1-i)/((n+1-i)*2+1)*str
next
msgbox str


如果转为批处理则为:
@echo off
setlocal E ...


这用的就是方案2,很好,小数计算你看不得不爱版主的那个代码看怎么样?
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
18 发表于 2008-04-30 23:35 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
'将那个C的代码用VBS处理了下,速度很快,因为是
'每位用一个数处理的,所以没有位数限制。
'恩,记得用CScript调用……
Dim b, c, d, e,n, f()
n = 100 '在这里定义位数
c = n / 4 * 14
ReDim f(c)
For b = 0 To c
f(b) = 2000
Next

Do While
(c)
b = c
d = f(b) * 10000
f(b) = d Mod (b * 2 - 1)
d = d \ (b * 2 - 1)
b = b - 1
Do While(b)
d = d * b + f(b) * 10000
f(b) = d Mod (b * 2 - 1)
d = d \ (b * 2 - 1)
b = b - 1
Loop
c = c - 14
i = e + d \ 10000
i = Right("0000" & i,4)
If k < 10 Then
k = k + 1
ShowLine = ShowLine & i
Else
k = 0
WSH.Echo ShowLine
ShowLine = ""
End If
e = d Mod 10000
Loop
WSH.Echo ShowLine
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
zh159 +10 2008-05-01 00:57
19 发表于 2008-04-30 23:42 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
数字不要太大哦~1000差不多也就1秒~
加个0就…………

'将那个C的代码用VBS处理了下,速度很快,因为是
'每位用一个数处理的,所以没有位数限制。
'恩,记得用CScript调用……

'这个是连续运算最后输出,比一行一行的输出速度快。

Dim b, c, d, e,n, f()
n = 1000 '在这里定义位数
c = n / 4 * 14
ReDim f(c)
For b = 0 To c
f(b) = 2000
Next

Do While
(c)
b = c
d = f(b) * 10000
f(b) = d Mod (b * 2 - 1)
d = d \ (b * 2 - 1)
b = b - 1
Do While(b)
d = d * b + f(b) * 10000
f(b) = d Mod (b * 2 - 1)
d = d \ (b * 2 - 1)
b = b - 1
Loop
c = c - 14
i = e + d \ 10000
i = Right("0000" & i,4)
If k < 10 Then
k = k + 1
ShowLine = ShowLine & i
Else
k = 0
'WSH.Echo ShowLine
ShowLine = ShowLine & vbCrLf
End If
e = d Mod 10000
Loop
WSH.Echo ShowLine
20 发表于 2008-04-30 23:50 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
恩,这个算法没有浮点运算哦~

+-*/取余运算。
有功夫的试这改成BAT吧。

没有看最大的数是多少,希望BAT可以支持到。
21 发表于 2008-05-01 03:51 ·  中国 甘肃 金昌 电信
初级用户
积分 47
发帖 31
注册 2008-03-17 19:04
UID 113236
性别 男
状态 离线
好牛X,膜拜了!
22 发表于 2008-05-01 03:52 ·  中国 甘肃 金昌 电信
初级用户
积分 47
发帖 31
注册 2008-03-17 19:04
UID 113236
性别 男
状态 离线
大虾们,能不能把结果输出到一个文本文件中呀?
23 发表于 2008-05-01 08:39 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
Originally posted by xtanbmy at 2008-5-1 03:52:
大虾们,能不能把结果输出到一个文本文件中呀?


把SHOWLINE前的echo换成FSO对象,文本读写操作的对象,然后write下……

在CSCRIPT下可以复制结果嘛。。。
24 发表于 2008-05-01 08:54 ·  法国
高级用户
★★
积分 783
发帖 268
注册 2006-12-26 17:18
UID 74627
性别 男
状态 离线
古算术法

355/113=3.1415926535897...
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃.
25 发表于 2008-05-01 09:03 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
Originally posted by PPdos at 2008-5-1 08:54:
古算术法



=。=
你自己打的吧?还是我的CALC有问题呢?
26 发表于 2008-05-01 10:13 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
Originally posted by PPdos at 2008-5-1 08:54:
古算术法


这个只能精确到6位
27 发表于 2008-05-02 12:02 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
弱弱的问一句,圆周率 可以理解为 a 除以 b 吗?是两个正整数吗?
貌似那个 1 除以 2003 的代码可以更简单,精确到 任意位小数。(cmd 范围内)
致精致简!
28 发表于 2008-05-02 12:15 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
不存在a/b=Pi的a和b的值……
29 发表于 2008-05-02 12:19 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
难怪我看到网上说用 22除以7 ,我用计算器算结果却不对。。
致精致简!
30 发表于 2008-05-02 12:45 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
if "π"=="无理的数" echo π 不可以用分数来表示
简单!简单!再简单!
论坛跳转: