[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [代码讨论]批处理开平方(计算平方根的值)

本帖最后由 SQYSQYSQY 于 2019-1-29 18:40 编辑

致浏览者,想对大数字(超过1000)计算平方根,请见31楼(约18秒算到150位),想对小数计算平方根,请见34楼(是个文件)(约23秒算到150位)
注意,部分计算器对最后一位进行了四舍五入,本程序可能会与计算器的最后一位相差1。这不是本程序的错误。
致浏览者,被开方数不超过1000,可用下面高效率程序进行计算(约3.5秒算到150位)。
  1. @echo off & SetLocal EnableDelayedExpansion
  2. ::变量c的值是被开方数,不得超过1000!
  3. set c=2
  4. for %%a in (16 8 4 2 1) do (
  5.         set /a "d=(a*%%a<<1)+%%a*%%a+b"
  6.         if !c! geq !d! set /a "a+=%%a","b=d"
  7. )
  8. if !b! equ !c! echo !a! & pause & exit /b
  9. set /p "=!a!."<nul
  10. set "d=0"
  11. for %%a in (512 256 128 64 32 16 8 4 2 1) do (
  12.         set /a "d+=%%a","e=((a*d<<1)+d*d/1000)/1000+b"
  13.         if !e! geq !c! set /a "d-=%%a"
  14. )
  15. set "e=00!d!" & set /p "=!e:~-3!"<nul
  16. set /a "e=(!a!!e:~-3!*!a!!e:~-3!)%%1000000","b=e/1000","e=e%%1000"
  17. set "e=  !e!" & set "e=!e:~-3!"
  18. set "b=000!e!!b!"
  19. set "e=  !d!"
  20. set "a=!e:~-3!!a!"
  21. for /l %%a in (3 3 2147483646) do (
  22.         set "d=0"
  23.         for %%b in (512 256 128 64 32 16 8 4 2 1) do (
  24.                 set /a "d+=%%b"
  25.                 if 1000 gtr !d! (
  26.                         set /a "c=d*d/1000"
  27.                         for /l %%c in (0 3 %%a) do set /a "c=((!a:~%%c,3!*d<<1)+c+!b:~%%c,3!)/1000"
  28.                         set /a "e=%%a+3"
  29.                         for %%c in (!e!) do set /a "c+=!b:~%%c,3!" & if !c! geq 1000 set /a "d-=%%b"
  30.                 ) else set /a "d-=%%b"
  31.         )
  32.         set "e=00!d!" & set /p "=!e:~-3!"<nul
  33.         set "c=" & set /a "f=d*d/1000"
  34.         for /l %%b in (0 3 %%a) do (
  35.         set /a "e=(!a:~%%b,3!*d<<1)+!b:~%%b,3!+f","f=e/1000","e%%=1000"
  36.         set "e=  !e!" & set "c=!c!!e:~-3!"
  37.         )
  38.         set /a "e=(d*d)%%1000" & set "e=  !e!" & set "b=000!e:~-3!!c!"
  39.         set "e=  !d!" & set "a=!e:~-3!!a!"
  40. )
  41. echo. & pause & exit /b
复制代码
1

评分人数

返回列表