中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-31 16:25
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [共同参与][挑战思路][批处理处理浮点运算] 精华I 查看 43,149 回复 136
61 发表于 2006-10-11 04:17 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
原来是一次算9位引起的,已经修改位一次算1位,请检查!
47楼的代码计算结果是:
0.9999999999999999999999999999999999999999999999999999999999999 +0.7777777777777
7 =1.17777777777777699999999999999999999999999999999999999999999999
62 发表于 2006-10-11 08:24 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
关于qwe1234567版主提出的几点问题, 都属于错误输入的范筹, 而脚本的运算是绝对没有任何问题的...

由于时间的关系对错误输入的检测稍候再改进~~~!
63 发表于 2006-10-11 08:56 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
0.9999999999999999999999999999999999999999999999999999999999999 和0.77777777777777那个是错误输入的?
64 发表于 2006-10-11 08:58 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
0.9+0.7=1.16
0.99+0.77=1.176
0.99+0.7=1.169
0.999 +0.77 =1.1769这是不是错误输入?

[ Last edited by qwe1234567 on 2006-10-11 at 09:03 ]
65 发表于 2006-10-11 09:13 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
sorry 我指的是输入两个小数点的情况.

由于时间关系没来得及测试, 你说的问题已经解决, 代码更新在47楼...
66 发表于 2006-10-11 09:37 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
67 发表于 2006-10-11 09:46 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
嗯,你代码中的变量名都用简单的j0, jq1等, 并且复合语句都写在一行.

而我写的变量名都用一些英文单词, 并且所有的复合语句每一句命令都另起一行再在前面空两格(已经习惯了, 代码更好看些). 不太喜欢用管道命令把命令拼接起来. 这样产生大量的空格, 英语单词虽然使用得不好, 但也是为了见名知意.

[ Last edited by pengfei on 2006-10-11 at 09:57 ]
68 发表于 2006-10-12 08:30 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
功能更加强大的加减法运算脚本已经完成, 请测试...

http://www.cn-dos.net/forum/viewthread.php?tid=23611&fpage=1
69 发表于 2006-10-12 21:35 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
70 发表于 2006-10-13 01:38 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
昨天想了一个晚上想到的也就是补位等,下回去代码好好看看
71 发表于 2006-10-13 02:42 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
如果使用中国珠算的进位原理,估计算乘、除的任意位数都没有问题了~:)
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
jvive +2 2008-04-03 11:29
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
72 发表于 2006-10-13 06:49 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  因为CMD功能有限,做除法运算的时候,对整数除法结果的小数部分直接做丢弃处理,并且不能处理小数除法,所以,用CMD来做除法运算应该慎之又慎。

  按位做乘法运算的方法是行得通的,实际上加法运算就已经包含了乘法运算的部分功能,各位有兴趣的话,可以在加法代码的基础上扩充一下。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
73 发表于 2006-10-13 08:02 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
Originally posted by namejm at 2006-10-13 06:49:
  因为CMD功能有限,做除法运算的时候,对整数除法结果的小数部分直接做丢弃处理,并且不能处理小数除法,所以,用CMD来做除法运算应该慎之叠...

原理上是可以行的通的,这几天家停电,等几天发个1000个以内数的加和10个数以内的乘,呵呵,基本的东西已经构思好了
74 发表于 2006-10-13 08:16 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
实现乘法运算完全可行, 前几天我已经完成了最简单的乘法运算脚本, 但如果运算位数大时就代码就比较复杂了.

由于其他的的原因一直没有进一步修改, 有时间一定好好写一段...
75 发表于 2006-10-13 23:38 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
昨天晚上加班改进了乘法运算脚本, 可以运算整数和浮点数, 通用各种情况. 因为牵涉到大量的取位运算, 所以效率不是很高, 有时间再好好优化一下.

欢迎大家测试...


@echo off
if not %1*==* set M=%1 & set N=%2 & goto jmp
:input
cls
set M=
set N=
set /p M= input primary number :
set /p N=input number two number :
:jmp
set sign=
if "%M:~0,1%"=="-" (
if "%N:~0,1%"=="-" (
set M=%M:~1%
set N=%N:~1%
goto begin
)
)
if "%M:~0,1%"=="-" (
set M=%M:~1%
set sign=-
goto begin
)
if "%N:~0,1%"=="-" (
set N=%N:~1%
set sign=-
)
:begin
echo %M% | find "." >nul || set M=%M%.0
echo %N% | find "." >nul || set N=%N%.0
if "%M:~-1%"=="." set M=%M%0
if "%N:~-1%"=="." set N=%N%0
if "%M:~0,1%"=="." set M=0%M%
if "%N:~0,1%"=="." set N=0%N%
call :jerque "%M%"
call :jerque "%N%"
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=." %%i in ("%M%") do (
set X=%%i
set X_=%%j
)
for /f "tokens=1,2 delims=." %%i in ("%N%") do (
set Y=%%i
set Y_=%%j
)
call :front %X%
set X=%front_%
call :front %Y%
set Y=%front_%
call :rear %X_%
set X_=%rear_%
call :rear %Y_%
set Y_=%rear_%
call :count %X_%
set jlxs=%count_%
call :count %Y_%
set /a jlxs=%count_%+%jlxs%
set son=@%Y%%Y_%
set result=0
set append=
:boss
if not "%son:~-1%"=="@" (
set xx=!son:~-1!
set son=!son:~0,-1!
call :under
call :plus
set result=!ll!
set append=0!append!
goto boss
)
if "%jlxs%"=="0" goto end
set result=!result:~0,-%jlxs%!.!result:~-%jlxs%!
call :rear %result%
set result=%rear_%
if "%result:~-1%"=="." set result=%result:~0,-1%
if "%result:~0,1%"=="." set result=0%result%
:end
cls
echo ============
echo 运算结果^^^!
echo ============
echo.
echo.
echo %M%*%N%=%sign%%result%
pause >nul
exit

:plus
set weave=%single:~0,-1%%weave:~0,-1%
call :count %weave%%append%
set num1=%count_%
call :count %result%
set num2=%count_%
set /a num=%num1%-%num2%
call :join %num% %result%
set result=%join_%
set lx=@%weave%%append%
set ly=@%result%
set ln=0
set ll=
:plus_
set /a lz=%lx:~-1%+%ly:~-1%+%ln%
set/a ln=0%lz:~0,-1%
set ll=%lz:~-1%%ll%
set lx=%lx:~0,-1%
set ly=%ly:~0,-1%
if "%lx%"=="@" (
if "%ln%"=="1" (
set ll=1%ll%
goto :eof
) else (
goto :eof
)
)
goto plus_
:under
set father=@%X%%X_%
set single=0
set weave=
:under_
set note=%single:~0,-1%
if "%note%"=="" set note=0
set weave=%single:~-1%%weave%
if not "%father:~-1%"=="@" (
set yy=!father:~-1!
set /a yy=!yy!
set father=!father:~0,-1!
call :op
)
goto :eof
:op
set part=!xx!
set part_=!yy!
set /a single=%part%*%part_%+!note!
goto under_
:front
set front_=%1
:front1
if "%front_:~0,1%"=="0" (
set front_=%front_:~1%
goto front1
)
goto :eof
:rear
set rear_=%1
:rear1
if "!rear_:~-1!"=="0" (
set rear_=!rear_:~0,-1!
goto rear1
)
goto :eof
:count
set count2=%1@
set count_=0
:count1
if not "!count2:~0,1!"=="@" (
set /a count_+=1
set count2=!count2:~1!
goto count1
)
goto :eof
:join
set margin=%1
set join_=%2
:join1
if not "%margin%"=="0" (
set /a margin-=1
set join_=0!join_!
goto join1
)
goto :eof
:jerque
for /f "tokens=1* delims=." %%i in (%1) do (
echo %%i%%j|findstr "^*$">nul || goto error
)
goto :eof
:error
cls
echo ======================
echo 运算数不符合要求^^!
echo ======================
echo.
echo.
echo 请按任意键重新输入...
pause >nul
goto input


[ Last edited by pengfei on 2006-10-15 at 09:35 ]
附件
无限制乘法运算脚本.rar (1.25 KiB, 下载附件所需积分 1 点, 下载次数: 20)
论坛跳转: