Board logo

标题: [数值计算] 批处理开平方(约8位有效数字) [打印本页]

作者: 梦想种子    时间: 2008-4-5 11:24     标题: 批处理开平方(约8位有效数字)

本帖最后由 梦想种子 于 2013-4-28 17:20 编辑

算法思路由 terse 提出。
晚辈只是扩展了可行数域和一点精度。
  1. @echo off
  2. set MAX=2147483647
  3. :begin
  4. cls
  5. set /p n=输入待开方数(1~%MAX%):
  6. set a=2
  7. set r=
  8. :int_part
  9.   set /a old_a=a,a=(n/a+a)/2
  10.   if %old_a% lss %a% goto int_part
  11.   set /a delta=old_a-a
  12.   if %delta% gtr 1 goto int_part
  13. ::prepare
  14.   set /a near_n=a*a
  15.   if %near_n% equ %n% goto end
  16.   set /a t=n-near_n,u=a
  17. :dec_part
  18.   set /a t*=100,d=10,tol_d=MAX/(u*20)
  19.   if %tol_d% lss 9 goto end
  20.   if %t% lss 0 goto end
  21.   :try_d
  22.     set /a d-=1,v=d*(d+u*20)
  23.     if %v% gtr %t% goto try_d
  24.   set /a t-=v,u=u*10+d
  25.   set r=%r%%d%
  26. goto dec_part
  27. :end
  28. if "%r%" neq "" set a=%a%.%r%
  29. echo 结果:%a%
  30. pause>nul
  31. goto begin
复制代码
2013.4.28更新:提高了被开方数定义域,提高了低段数字的精度,修正一些bug。
作者: 梦想种子    时间: 2008-4-5 15:27

较早时写了一个:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 开平方
  4. echo 请输入需要开平方的数字:
  5. set a=2
  6. set comp=99999
  7. set /p k=
  8. for /l %%i in (1,1,9) do (
  9. if "!k:~%%i,1!" == "" (
  10. set len=%%i
  11. goto begin
  12. ))
  13. :begin
  14. set /a t=len%%2
  15. if not %t% equ 0 set /a len+=1
  16. set /a len=len/2
  17. :acr
  18. set /a a=(k/a+a)/2
  19. set /a m=a*a
  20. set /a t=a-!comp:~0,%len%!
  21. if %m% gtr %k% goto acr
  22. if %m:-=% neq %m% goto acr
  23. if %t% gtr 0 goto acr
  24. set /a r=(k-m)*5000/a
  25. set r=0000%r%
  26. echo 结果:%a%.%r:~-4,-1%
  27. pause>nul
复制代码
发现对较小的数的开方,小数部分有些问题。
后来terse才写了个可以控制小数精度位数的批处理。
但可接受的最大数才有321063。
和自己的一比较,就知道有个地方可以改进的。才有了楼顶的批处理。
作者: garyng    时间: 2011-9-1 21:18

能获得跟多小数点就很有实用性了~
而且这很考功力~
作者: nchcj    时间: 2013-2-22 22:40

牛人呐,,正在学习中。。。
作者: m91opse    时间: 2018-4-28 09:57

支持 给力 赞




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2