![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 12:49 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [共同参与][挑战思路][批处理处理浮点运算] |
| 可打印版本 45,393 / 136 |
| 第16楼 pengfei | 发表于 2006-10-05 05:22 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
10楼代码已更新, 可以去最高位的多个零. 请测试...
|
|
| 第17楼 不得不爱 | 发表于 2006-10-05 05:37 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
你的要出错!
0.88+12.3=100.3 这个你没有试过? |
|
| 第18楼 不得不爱 | 发表于 2006-10-05 05:59 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
15楼代码已更新, 可以去最高位的多个零,接受.98这样的小数!请测试...
|
|
| 第19楼 无奈何 | 发表于 2006-10-05 06:53 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
个人非常赞同这样的讨论方式,大家可以讨论一下更详尽评判和奖励办法。
我也提交一卷,模拟了一下手工计算过程,主要是想练习一下字符的处理,编写过程颇为费劲,执行效率也不高。支持两个数字的各种复杂格式,并且数字长度不受限制只是会很慢。
测试代码: [ Last edited by 无奈何 on 2006-10-5 at 07:01 ] |
|
| 第20楼 redtek | 发表于 2006-10-05 07:37 |
| 金牌会员 发帖 1,147 积分 2,902 | |
|
这个产生随机数的测试计算方式非常有意思啊~~~~~:)
|
|
| 第21楼 redtek | 发表于 2006-10-05 07:45 |
| 金牌会员 发帖 1,147 积分 2,902 | |
Originally posted by pengfei at 2006-10-4 23:50: (两个要计算的浮点数) 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 ] |
|
| 第22楼 pengfei | 发表于 2006-10-05 08:37 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
呵呵~ qwe1234567版主真是有心, 测试也这么全面.
代码已更新在10楼! 可以去最高位的多个零. 前面各位提出的缺陷都已解决. 目前测试一切正常, 期待高手们找出更多的缺陷来. 交流才能进步... ^_^ |
|
| 第23楼 pengfei | 发表于 2006-10-05 08:50 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
刚才测试了15楼的代码, 还是有缺陷比如(00.85 12.871) (00.42 13.89)等.
版主说的去最高位多个零好像不行, 另外整数最前出现两个或以上的零运算会出错. |
|
| 第24楼 namejm | 发表于 2006-10-05 10:08 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
关于两种浮点数计算方法优劣的一点比较 到目前为止,各位已经找到了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 ] |
|
| 第25楼 pengfei | 发表于 2006-10-05 10:14 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
哈哈~ 又解决一个难题.
如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 ] |
|
| 第26楼 pengfei | 发表于 2006-10-05 10:40 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
『第 19 楼』 无奈何版主的代码好强~~~!
|
|
| 第27楼 无奈何 | 发表于 2006-10-05 10:42 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
计算浮点位或整数位的前置零的简便方法是:在数字最前位补 1 ,计算后判断最前位是否是 2 ,是的话去掉最前位,不是的话也去掉最前位并在最前位补 1 。
浮点位需补零对齐。 [ Last edited by 无奈何 on 2006-10-5 at 10:45 ] |
|
| 第28楼 pengfei | 发表于 2006-10-05 10:44 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
呵呵~ 我正是用这种方法来实现的.
|
|
| 第29楼 不得不爱 | 发表于 2006-10-05 23:58 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
15楼代码已更新, 可以去最高位的多个零,接受.98这样的小数!请测试...
|
|
| 第30楼 pengfei | 发表于 2006-10-06 00:12 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
关于整数浮点数分段运算代码:
代码更新在4楼~~~! 解决了小数位第一位为零可能出现进制错误的问题. 目前测试可以适应各种不同情况. 下面是对4楼和10楼代码的运算范围的比较: 欢迎大家测试... [ Last edited by pengfei on 2006-10-6 at 03:50 ] |
|
| 上一页 1 2 3 4 5 … 10 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |