中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [共同参与][挑战思路][批处理处理浮点运算]
« [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] »
作者:
标题: [共同参与][挑战思路][批处理处理浮点运算] 上一主题 | 下一主题
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 121 楼』:  

呵呵,不是说明,是用了中文的标号,有了中文标号连说明都可以省了!



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-23 03:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 122 楼』:  



  Quote:
Originally posted by qwe1234567 at 2006-10-23 03:55:
呵呵,不是说明,是用了中文的标号,有了中文标号连说明都可以省了!

中文的也可以,还没有试过,不知道中文最多支持几个汉字

2006-10-23 03:57
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 123 楼』:  

我这也是第一次用中文的标号,我想应该没有个数限制吧



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-23 04:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 124 楼』:  

另外变量也可以是中文



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-23 04:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 125 楼』:  



  Quote:
Originally posted by qwe1234567 at 2006-10-23 04:18:
我这也是第一次用中文的标号,我想应该没有个数限制吧

字母是8个,我想应该有,测试下看看

2006-10-23 04:31
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 126 楼』:  

还真没有限制,呵呵~以后标号用中文了

2006-10-23 04:35
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 127 楼』:  

我试了下,在CMD里字母不只8个(估计是没有什么限制吧,或者是255个),你可以用下面的代码测试下
@echo off
:abcdefghi
set /p a=请输入:
if %a%.==5. (goto abcdefghi) else goto abcdefghi1
:abcdefghi1
echo %a%
pause



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-23 04:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 128 楼』:  



  Quote:
Originally posted by namejm at 2006-10-4 21:08:
 到目前为止,各位已经找到了CMD下计算浮点数的两种方法:

  方法一:浮点数的整数部分和小数部分分别计算。实现的过程是:整数部分直接相加即可;小数部分稍微有点麻烦:如果小数部分位数不一致,则要以位数最多的那个数为基准,在另外一个数的小数部分补足0,然后再对小数部分作整数的加法;如果相加的结果位数超过了最长的位数,则要向整数部分进1,小数部分的最高位要相应地减1;

  方法二:把整数部分和小数部分重组成一个新数,再对新数进行加法操作,最后把小数点插入原来的位置;

  两种方法各自的优点和缺点:

  方法一:优点:能处理的浮点数的范围很大,只要相加的结果在 (2^32-1.2^32-1) 和 -(2^32-1.2^32-1)之间,都能处理;缺点:大都出现在小数部分,如:若小数部分最高位为08或09都可能出错,要对这两种情况另作处理;小数部分相加结果的位数长度如果超过最长的位数,则要对整数部分做加1、对小数最高位作减1处理;如果扩充到三个或三个以上的浮点数进行加法操作,则进位的问题将更加复杂;

  方法二:优点:不用另行处理08和09的情况,不用考虑进位的问题(看了楼下pengfei的分析,发现这个地方的描述有点问题,具体情况请参阅楼下的描述);缺点:能处理的浮点数范围比较小,相加结果去掉小数点之后新数值的范围在 (2^32-1.2^32-1) 和 -(2^32-1.2^32-1)之间才能成功。

精彩!!!!

日常用的小数多数是"金额",只有2位小数,用"方法二"比较好!

这个帖子对我的启发很大,谢谢大家!!!



[ Last edited by xycoordinate on 2007-3-4 at 10:51 AM ]

2007-3-4 23:15
查看资料  发送邮件  发短消息 网志  OICQ (226308607)  编辑帖子  回复  引用回复
6622186
高级用户





积分 894
发帖 411
注册 2007-2-17
状态 离线
『第 129 楼』:  

若能改为命令行版本(使用时,输入文件名和相应参数) 就太好了.



@set c=     不知则觉多,知则觉少,越知越多,便觉越来越少.        --- 知多少.
@for,/l,%%i,in,(1,1,55)do,@call,set/p=%%c:~%%i,1%%<nul&ping/n 1 127.1>nul


2007-3-10 08:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
6622186
高级用户





积分 894
发帖 411
注册 2007-2-17
状态 离线
『第 130 楼』:  

标号也可以用中文, 受教了!



@set c=     不知则觉多,知则觉少,越知越多,便觉越来越少.        --- 知多少.
@for,/l,%%i,in,(1,1,55)do,@call,set/p=%%c:~%%i,1%%<nul&ping/n 1 127.1>nul


2007-3-10 09:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 131 楼』:  到此一游


@echo off
set aa=%1
set bb=%2

::调用浮点乘法函数
call :mul cc aa bb %3

echo %cc%
goto :eof

:mul
::浮点乘法函数,头尾都可带0,支持乘积为:49位整数,49位小数。
::第一个参数为接收变量名,第二、三个为相乘数变量名,第四个指定要保留小数位数
@echo off&setlocal enabledelayedexpansion
set cc=0
set ka=!%2:*.=!
set kb=!%3:*.=!

set maa=!%2:.=!
set mb=!%3:.=!

for /l %%a in (0,1,49) do if not "!maa:~%%a,1!"=="0" (set maa=!maa:~%%a!&goto :maaok)
:maaok

for /l %%a in (0,1,49) do if not "!mb:~%%a,1!"=="0" (set mb=!mb:~%%a!&goto :mbok)
:mbok

if "!kb!."=="!%3!." set kb=
if "!ka!."=="!%2!." set ka=
set kab=!kb!!ka!#
for /l %%a in (0,1,49) do if "!kab:~%%a,1!"=="#" (set kab=%%a&goto :lp1)

:lp1
if defined mb (set al=!mb:~-4!
if "!al:~0,1!"=="0" set/a al=1!al!-10000
set mb=!mb:~0,-4!
) else (goto :endmul)
set ma=!maa!
set zero=!mz!
set mz=!mz!0000

for /l %%a in (1,1,12) do (
        if defined ma (set bl=!ma:~-4!
                if "!bl:~0,1!"=="0" set/a bl=1!bl!-10000
                set/a bl*=al&set ma=!ma:~0,-4!
        ) else (goto :end1)
        set bl=!bl!!zero!
        set zero=!zero!0000
        call :add cc cc bl
)

:end1
goto :lp1

:endmul
if not %kab%==0 (
set ka=00000000000000000000000000000000000000000000000000%cc%
if "!cc:~0,-%kab%!"=="" (set cc=0.!ka:~-%kab%,%4!) else (set cc=!cc:~0,-%kab%!.!cc:~-%kab%,%4!)
)
endlocal&set %1=%cc%&goto :eof

:add
set xa=%cc%
set xb=%bl%
set cc=
set zz=0
set zy=
for /l %%a in (9,9,81) do (
        if "!xa!!xb!"=="" goto :end
        set cc=!zy!!cc!
if defined xa (set "aa=000000000!xa:~-9!"&set xa=!xa:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
        set/a zz=!zz:~0,-9!+1!bb:~-9!-1000000000+1!aa:~-9!-1000000000
        set zy=000000000!zz!
        set zy=!zy:~-9!
)
:end
set cc=%zz%%cc%
if not %cc% gtr 0 goto :endok
if "%cc:~0,2%"=="0." goto :endok
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :endok)
:endok
goto :eof
[ Last edited by netbenton on 2009-4-5 at 10:30 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-4-5 12:29
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 132 楼』:  

4楼的,天书啊。。
但是为什么要在浮点运算上这么深入呢?没见过多少要用到浮点运算的批处理啊。你们这些高手啊,实在太无聊了。

2009-4-5 14:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 133 楼』:  改进了一下


@echo off
set aa=%1
set bb=%2

::调用浮点乘法函数
echo %time%
call :mul cc aa bb %3
echo %time%

echo %cc%
goto :eof
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:mul <接收变量名> <被乘数> <乘数> [指定保留小数位]
::
::浮点乘法函数,头尾都可带0,支持乘积为:49位整数,49位小数。
::第一个参数为接收变量名,第二、三个为相乘数变量名,第四个批定要保留小数位数
::最大位数计算仅需12毫秒
::别看代码那么长,速度可不慢
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off&setlocal enabledelayedexpansion
set cc=0
set ka=!%2:*.=!
set kb=!%3:*.=!

set maa=!%2:.=!
set mb=!%3:.=!

for /l %%a in (0,1,49) do if not "!maa:~%%a,1!"=="0" (set maa=!maa:~%%a!&goto :maaok)
:maaok

for /l %%a in (0,1,49) do if not "!mb:~%%a,1!"=="0" (set mb=!mb:~%%a!&goto :mbok)
:mbok

if "!kb!."=="!%3!." set kb=
if "!ka!."=="!%2!." set ka=
set kab=!kb!!ka!#
for /l %%a in (0,1,49) do if "!kab:~%%a,1!"=="#" (set kab=%%a&goto :lp1)
set mz=
:lp1
if defined mb (set al=!mb:~-4!
if "!al:~0,1!"=="0" set/a al=1!al!-10000
set mb=!mb:~0,-4!
) else (goto :endmul)
set ma=!maa!
set "cl= "
for /l %%a in (1,4,91) do (
        if not defined ma (goto :end1)
        set bl=!ma:~-4!
        if "!bl:~0,1!"=="0" set/a bl=1!bl!-10000
        set/a bl=!cl:~0,-%%a!+bl*al
        set ma=!ma:~0,-4!
        set cl=0000!cl:~-%%a!
        set cl=!bl!!cl:~-%%a!
)
:end1
set cl=%cl:~0,-1%%mz%
set mz=!mz!0000

set xa=%cc%
set xb=%cl%
set cc=
set zz=0
set zy=
for /l %%a in (9,9,81) do (
        if "!xa!!xb!"=="" goto :end2
        set cc=!zy!!cc!
if defined xa (set "aa=000000000!xa:~-9!"&set xa=!xa:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
        set/a zz=!zz:~0,-9!+1!bb:~-9!-1000000000+1!aa:~-9!-1000000000
        set zy=000000000!zz!
        set zy=!zy:~-9!
)
:end2
set cc=%zz%%cc%
if not %cc% gtr 0 goto :lp1
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :lp1)
goto :lp1

:endmul
if not %kab%==0 (
set ka=00000000000000000000000000000000000000000000000000%cc%
if "!cc:~0,-%kab%!"=="" (set cc=0.!ka:~-%kab%,%4!) else (set cc=!cc:~0,-%kab%!.!cc:~-%kab%,%4!)
)
endlocal&set %1=%cc%&goto :eof




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-4-7 09:01
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
mmh1
初级用户





积分 20
发帖 24
注册 2009-3-18
状态 离线
『第 134 楼』:  

请问下这句什么意思??
if "%number1:~0,1%"=="." set number1=0%number1%

2009-4-9 00:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xrw
新手上路





积分 5
发帖 5
注册 2009-5-9
状态 离线
『第 135 楼』:  

请问下这句什么意思??
if "%number1:~0,1%"=="." set number1=0%number1%

2009-5-23 17:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: