本帖最后由 老刘1号 于 2019-4-9 00:57 编辑
回复 13# hongrk
这个如果有bug的话其实是很隐蔽的,因为复杂数字人也懒得手算,除非有现成软件验证
我最初用bat写的高精度加减一直有bug,两年之后才发现(还是自己发现的,哈哈
特别是借用批处理的变量截取等做运算,感觉需要考虑的更多,
看着lz修bug有种莫名的快感,哈哈,想当年修bug修的都想砸电脑了
分享下测试用的批,不过大多不适用于lz的函数
如果以后lz写了正负浮点数四则的话,可以用这两个测试
加法测试.bat- @echo off
- Setlocal enabledelayedexpansion
- ::CODER BY 老刘 POWERD BY iBAT
-
- rem 加法
- rem 整数
- rem 伪浮点数
- test + 00000001.0000 1.0
- rem 双0
- test + 000000000000000.0 0.0000000000000000000
- rem 无小数点带进位
- test + 2333 7667
- rem 浮点数
- rem 有间隔进位
- test + 1.80028 00.2007200
- rem 跨小数点连续进位(最后一位也进位)
- test + 2.73210962 7.26789038
- rem 减法
- rem 整数
- rem 大减小
- rem 负负得正
- test - 1 -2
- rem 带借位
- test - 2541 1542
- rem 小减大
- test + 2541 -2542
- rem 浮点数
- rem 连续借位
- test - 7.998253 6.998254
- rem 间隔借位
- test - 2.36291 0.37192
-
- pause
复制代码 测试-计算圆周率.BAT- @Rem 公式:pi=2*1+2*1!/3!!+2*2!/5!!+2*3!/7!!+...+2*k!/(2*k+1)!!+...
-
- @echo off
- Setlocal enabledelayedexpansion
- ::CODER BY 老刘 POWERD BY iBAT
- Set Calc=高精度正负浮点数四则运算
- Title 任意键提高精度
- Set /a k=0,sss=1
- :loop
- Set /a k+=1,n=2*k+1
- Call :! !k!
- Set aaa=!Re!
- Call :!! !n!
- Set bbb=!Re!
- For /f %%b in ('!calc! / %aaa:~,93% %bbb:~,93%') Do Set ccc=%%b
- For /f %%b in ('!calc! + %ccc:~,93% %sss:~,93%') Do Set sss=%%b
- For /f %%b in ('!calc! * %sss:~,93% 2') Do Echo %%b
- rem Pause>nul
- Goto :loop
-
- :! 阶乘
- Set Re=1
- For /l %%a in (1 1 %1) Do (
- For /f %%b in ('!calc! * !re! %%a') Do Set Re=%%b
- )
- Goto :Eof
-
- :!! 双阶乘
- Set Re=1
- For /l %%a in (1 2 %1) Do (
- For /f %%b in ('!calc! * !re! %%a') Do Set Re=%%b
- )
- Goto :Eof
复制代码
2.6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
2.9333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332
3.0476190476190476190476190476190476190476190476190476190476190476190476190476190476190476188
3.0984126984126984126984126984126984126984126984126984126984126984126984126984126984126984124
3.1215007215007215007215007215007215007215007215007215007215007215007215007215007215007215004
3.1321567321567321567321567321567321567321567321567321567321567321567321567321567321567321564
3.1371295371295371295371295371295371295371295371295371295371295371295371295371295371295371292
3.1394696806461512343865285041755629990924108571167394696806461512343865285041755629990924104
3.140578169680336862999401699092101568881754640268572157117048757915630980646460522621513333
3.1411060216013776385293413157190246973528707274837305797058119039543188149999295510131423438
3.1413584725201362703045298280188574979260132039779367818134812346684738662124582167656605662
3.141479648961140413556620313922777242201121592695155758825162513411268290794471976326869313
3.141537993173475741789108325654294156111358965040483414423379425398539680408034156856340191
3.1415661593449479692116887451108885283438873516899519378156220725648086271180296922843606148
3.1415797881375958211903566900092406439402720549074367071989652889355839239131888223301769488
3.1415863960370614463921350875357143969567010019219747772030104847517174011472053702311788076
3.1415896055882304643472845949057159341361093476147504112049752941481250900894419792116654248
3.141591166991501878487627598491122087358524218492316935854579796016647749574854383580550806
3.1415919276751469264021536771609353414925212068685672940172076302602869939395424780166744532
3.1415922987403396327019224960242588800944709572960064931209285250132817472881708167660030616
3.1415924799582244427552979657016959570861208354117326136134433805903256965979660519691635446
3.1415925685536347943369481953217763058375941091571987169653395322057694051494215002907086696
3.1415926119088356046854153289656454126734214558837034058396716915069439859299209750012520286
这个圆周率的测试其实是有问题的,如果继续算几次的话就会与实际圆周率不符,
原因是结果可以256位,输入只能93位,而输出转输入时没有做四舍五入而是直接截取,每算一次就损失一定精度。
不过做测试应该是够了,毕竟如果程序出了毛病应该连3.14都跑不出来,哈哈。 |