|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
16 楼』:
10楼代码已更新, 可以去最高位的多个零. 请测试...
|
|
2006-10-5 05:22 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-5 05:37 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-5 05:59 |
|
|
无奈何
荣誉版主
积分 1338
发帖 356
注册 2005-7-15
状态 离线
|
『第
19 楼』:
个人非常赞同这样的讨论方式,大家可以讨论一下更详尽评判和奖励办法。
我也提交一卷,模拟了一下手工计算过程,主要是想练习一下字符的处理,编写过程颇为费劲,执行效率也不高。支持两个数字的各种复杂格式,并且数字长度不受限制只是会很慢。
Quote: |
- @echo off
- setlocal
- set number1=%~1
- set number2=%~2
- if "%number1%" == "" goto :EOF
- if "%number2%" == "" set number2=0
- set D1=0
- set D2=0
- set flag=0
- set D1=%number1:*.=%
- call set I1=%%number1:.%D1%=%%
- set D2=%number2:*.=%
- call set I2=%%number2:.%D2%=%%
- if "%D1%" == "%number1%" set D1=0
- if "%D2%" == "%number2%" set D2=0
- set D1=1%D1%
- set D2=1%D2%
- call :fill %D1% %D2% D1 D2
- call :sum $%D1% $%D2%
- if "%sum:~0,1%" GTR "2" set /a flag=1
- set D_sum=%sum:~1%
- call :sum $%I1% $%I2%
- set I_sum=%sum%
- echo %number1% + %number2% =
- if %D_sum% EQU 0 (
- echo. %I_sum%
- ) else (
- echo. %I_sum%.%D_sum%
- )
- goto :EOF
- :sum
- set sum=
- set temp1=%1
- set temp2=%2
- if "%flag%" == "1" set H=1
- set n=1
- :next
- call set x=%%temp1:~-%n%,1%%
- call set y=%%temp2:~-%n%,1%%
- if "%x%" == "$" (
- if "%y%" == "$" (
- if "%H%" GTR "0" set sum=%H%%sum%
- goto :EOF
- ))
- if "%x%" == "$" set x=0
- if "%y%" == "$" set y=0
- call :sub %x% %y% %H%
- set sum=%ERRORLEVEL%%sum%
- set /a n+=1
- goto next
- :sub
- set H=0
- if "%1" == "" exit /b 0
- if "%2" == "" exit /b %1
- if "%3" == "" call :sub %1 %2 0 &goto :EOF
- set /a s=%1 + %2 + %3
- set H=%s:~0,-1%
- set L=%s:~-1%
- exit /b %L%
- goto :EOF
- :fill
- setlocal
- set n=-1
- set temp1=%1
- set temp2=%2
- :loop
- set /a n+=1
- call set x=%%temp1:~%n%,1%%
- call set y=%%temp2:~%n%,1%%
- if "%x%" == "" (
- if "%y%" == "" (
- endlocal &set %3=%temp1% &set %4=%temp2%
- goto :EOF
- ))
- if "%x%" == "" set temp1=%temp1%0
- if "%y%" == "" set temp2=%temp2%0
- goto :loop
- 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 ]
|
☆开始\运行 (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 |
|
|
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 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
23 楼』:
刚才测试了15楼的代码, 还是有缺陷比如(00.85 12.871) (00.42 13.89)等.
版主说的去最高位多个零好像不行, 另外整数最前出现两个或以上的零运算会出错.
|
|
2006-10-5 08:50 |
|
|
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 ]
|
尺有所短,寸有所长,学好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 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
26 楼』:
『第 19 楼』 无奈何版主的代码好强~~~!
|
|
2006-10-5 10:40 |
|
|
无奈何
荣誉版主
积分 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 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
28 楼』:
呵呵~ 我正是用这种方法来实现的.
|
|
2006-10-5 10:44 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
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 |
|