中国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] »
作者:
标题: [共同参与][挑战思路][批处理处理浮点运算] 上一主题 | 下一主题
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 16 楼』:  

10楼代码已更新, 可以去最高位的多个零. 请测试...

2006-10-5 05:22
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


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

你的要出错!
0.88+12.3=100.3
这个你没有试过?



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

我爱DOS


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

15楼代码已更新, 可以去最高位的多个零,接受.98这样的小数!请测试...

   此帖被 +6 点积分          点击查看详情   
评分人:【 分数: +6  时间:2006-10-20 20:19




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





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 19 楼』:  

个人非常赞同这样的讨论方式,大家可以讨论一下更详尽评判和奖励办法。
        我也提交一卷,模拟了一下手工计算过程,主要是想练习一下字符的处理,编写过程颇为费劲,执行效率也不高。支持两个数字的各种复杂格式,并且数字长度不受限制只是会很慢。

  Quote:

  1. @echo off
  2. setlocal
  3. set number1=%~1
  4. set number2=%~2
  5. if "%number1%" == "" goto :EOF
  6. if "%number2%" == "" set number2=0
  7. set D1=0
  8. set D2=0
  9. set flag=0
  10. set D1=%number1:*.=%
  11. call set I1=%%number1:.%D1%=%%
  12. set D2=%number2:*.=%
  13. call set I2=%%number2:.%D2%=%%

  14. if "%D1%" == "%number1%" set D1=0
  15. if "%D2%" == "%number2%" set D2=0
  16. set D1=1%D1%
  17. set D2=1%D2%
  18. call :fill %D1% %D2% D1 D2
  19. call :sum $%D1% $%D2%
  20. if "%sum:~0,1%" GTR "2" set /a flag=1
  21. set D_sum=%sum:~1%
  22. call :sum $%I1% $%I2%
  23. set I_sum=%sum%
  24. echo %number1% + %number2% =
  25. if %D_sum% EQU 0 (
  26.         echo.    %I_sum%
  27. ) else (
  28.         echo.    %I_sum%.%D_sum%
  29. )
  30. goto :EOF

  31. :sum
  32. set sum=
  33. set temp1=%1
  34. set temp2=%2
  35. if "%flag%" == "1" set H=1
  36. set n=1
  37. :next
  38. call set x=%%temp1:~-%n%,1%%
  39. call set y=%%temp2:~-%n%,1%%
  40. if "%x%" == "$" (
  41.         if "%y%" == "$" (
  42.                 if "%H%" GTR "0" set sum=%H%%sum%
  43.                 goto :EOF
  44. ))
  45. if "%x%" == "$" set x=0
  46. if "%y%" == "$" set y=0
  47. call :sub %x% %y% %H%
  48. set sum=%ERRORLEVEL%%sum%
  49. set /a n+=1
  50. goto next

  51. :sub
  52. set H=0
  53. if "%1" == "" exit /b 0
  54. if "%2" == "" exit /b %1
  55. if "%3" == "" call :sub %1 %2 0 &goto :EOF
  56. set /a s=%1 + %2 + %3
  57. set H=%s:~0,-1%
  58. set L=%s:~-1%
  59. exit /b %L%
  60. goto :EOF

  61. :fill
  62. setlocal
  63. set n=-1
  64. set temp1=%1
  65. set temp2=%2
  66. :loop
  67. set /a n+=1
  68. call set x=%%temp1:~%n%,1%%
  69. call set y=%%temp2:~%n%,1%%
  70. if "%x%" == "" (
  71.         if "%y%" == "" (
  72.                 endlocal &set %3=%temp1% &set %4=%temp2%
  73.                 goto :EOF
  74. ))
  75. if "%x%" == "" set temp1=%temp1%0
  76. if "%y%" == "" set temp2=%temp2%0
  77. goto :loop
  78. goto :EOF
        无奈何发表于    2006-10-04  18:56

测试代码:
call sum %RANDOM%
call sum %RANDOM% %RANDOM%
call sum .%RANDOM% %RANDOM%
call sum %RANDOM% .%RANDOM%
call sum %RANDOM%.%RANDOM% %RANDOM%
call sum %RANDOM% %RANDOM%.%RANDOM%
call sum %RANDOM%.%RANDOM% %RANDOM%.%RANDOM%
call sum %RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM% %RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%
pause
[ Last edited by 无奈何 on 2006-10-5 at 07:01 ]

   此帖被 +6 点积分          点击查看详情   




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-10-5 06:53
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 20 楼』:  

这个产生随机数的测试计算方式非常有意思啊~~~~~:)

2006-10-5 07:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 21 楼』:  



  Quote:
Originally posted by pengfei at 2006-10-4 23:50:
解决了小数点后第一位为0且后面出现8或9, 导致数值为无效数字的问题.

一个全新的算法, 大概的意思是, 读取小数位数不足的补零. 去.号后小数和整 ...

(两个要计算的浮点数)
1932.00010002(小数位长度8)
    19.02310

(去小数点儿,以最长小数位对准,位数不足被补0)
193200010002
   1902310000
---------------------------
相加之和:195102320002

1951.02320002
(以合并前小数点最长的位数为基数,向左移小数点,完成浮点计算)

(另一种)
(或n个浮点的整数位相计算,n个浮点的小数位相计算,最长进位)
(浮点数左边消0消干净)

和我思考的方式一样~:)
不足补0,然后浮点数就当做一个整数与另一个当做整数的浮点运算(去点),
最后再小数点向左移位:)

激动~:)
除了激动之外就是有一点无柰,看来真正想精通批处理的网友是极少数,
对好玩的算法和象写代码一样的批处理喜欢的网友相比极少,
多数网友最喜欢用的时候想到了批处理,用不到的时候可有可无……

[ Last edited by redtek on 2006-10-5 at 08:01 ]

2006-10-5 07:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 22 楼』:  

呵呵~ qwe1234567版主真是有心, 测试也这么全面.

代码已更新在10楼! 可以去最高位的多个零. 前面各位提出的缺陷都已解决. 目前测试一切正常, 期待高手们找出更多的缺陷来. 交流才能进步... ^_^

2006-10-5 08:37
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 23 楼』:  

刚才测试了15楼的代码, 还是有缺陷比如(00.85   12.871)  (00.42  13.89)等.

版主说的去最高位多个零好像不行, 另外整数最前出现两个或以上的零运算会出错.

2006-10-5 08:50
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 24 楼』:  关于两种浮点数计算方法优劣的一点比较

  到目前为止,各位已经找到了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)之间才能成功。

  以上是我的一点粗浅认识,有的地方可能不是很正确,欢迎大家一起探讨。

[ Last edited by namejm on 2006-10-5 at 10:45 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 xycoordinate 分数: +1  时间:2007-3-4 23:16




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-5 10:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 25 楼』:  

哈哈~ 又解决一个难题.

如10楼的代码在此之前运算(0.0+0.48), 这里根据代码的运算原理, 最终运算为(000+048)显然进制错误. 这里我采用去整数零位, 只进行小数位运算.

当解决整数个位为零的问题时, 另一个问题又出现了(0.5+0.082), 最终运算为(500+082), 呵呵~ 整数的零刚去掉, 小数位的零又出现了, 还是无效数字. 头晕...

先前解决上面的问题, 采取整数个位都赋1. 虽然可以解决个位都为零的问题, 但如果其中一个运算数个位不为零, 另一个不为零. 这种方法就行不通了.

现在采用其中一个运算数个位为零就赋1值. 两个都为零两个都赋1. 然后计数变量相应的加1. 最后处理运算结果时, 当处理到个位时相应的减去计数值. 这样就解决了这个进制问题!

目前测试暂时没有发现问题! 代码已更新在10楼~~~!

[ Last edited by pengfei on 2006-10-5 at 22:31 ]

2006-10-5 10:14
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 26 楼』:  

『第 19 楼』 无奈何版主的代码好强~~~!

2006-10-5 10:40
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 27 楼』:  

计算浮点位或整数位的前置零的简便方法是:在数字最前位补 1 ,计算后判断最前位是否是 2 ,是的话去掉最前位,不是的话也去掉最前位并在最前位补 1 。
浮点位需补零对齐。

[ Last edited by 无奈何 on 2006-10-5 at 10:45 ]



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-10-5 10:42
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 28 楼』:  

呵呵~ 我正是用这种方法来实现的.

2006-10-5 10:44
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


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

15楼代码已更新, 可以去最高位的多个零,接受.98这样的小数!请测试...



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




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 30 楼』:  

关于整数浮点数分段运算代码:

代码更新在4楼~~~! 解决了小数位第一位为零可能出现进制错误的问题. 目前测试可以适应各种不同情况.

下面是对4楼和10楼代码的运算范围的比较:
整数浮点数分段运算代码: (代码请见4楼)
整数位最多可运算9位数, 小数位最多可运算8位数.
小数位整数位加起来最多可运算17位数.
否则会溢出或为无效数字...

整数浮点数合并运算代码: (代码请见10楼)
整数位最多可运算8位数, 小数位最多可运算8位数.
小数位整数位加起来最多可运算9位数
否则会溢出或为无效数字...
欢迎大家测试...

[ Last edited by pengfei on 2006-10-6 at 03:50 ]

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


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



论坛跳转: