返回列表 发帖

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

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

致浏览者,想对大数字(超过1000)计算平方根,请见31楼(约18秒算到150位),想对小数计算平方根,请见34楼(是个文件)(约23秒算到150位)
注意,部分计算器对最后一位进行了四舍五入,本程序可能会与计算器的最后一位相差1。这不是本程序的错误。
致浏览者,被开方数不超过1000,可用下面高效率程序进行计算(约3.5秒算到150位)。
@echo off & SetLocal EnableDelayedExpansion
::变量c的值是被开方数,不得超过1000
set c=2
for %%a in (16 8 4 2 1) do (
        set /a "d=(a*%%a<<1)+%%a*%%a+b"
        if !c! geq !d! set /a "a+=%%a","b=d"
)
if !b! equ !c! echo !a! & pause & exit /b
set /p "=!a!."<nul
set "d=0"
for %%a in (512 256 128 64 32 16 8 4 2 1) do (
        set /a "d+=%%a","e=((a*d<<1)+d*d/1000)/1000+b"
        if !e! geq !c! set /a "d-=%%a"
)
set "e=00!d!" & set /p "=!e:~-3!"<nul
set /a "e=(!a!!e:~-3!*!a!!e:~-3!)%%1000000","b=e/1000","e=e%%1000"
set "e=  !e!" & set "e=!e:~-3!"
set "b=000!e!!b!"
set "e=  !d!"
set "a=!e:~-3!!a!"
for /l %%a in (3 3 2147483646) do (
        set "d=0"
        for %%b in (512 256 128 64 32 16 8 4 2 1) do (
                set /a "d+=%%b"
                if 1000 gtr !d! (
                        set /a "c=d*d/1000"
                        for /l %%c in (0 3 %%a) do set /a "c=((!a:~%%c,3!*d<<1)+c+!b:~%%c,3!)/1000"
                        set /a "e=%%a+3"
                        for %%c in (!e!) do set /a "c+=!b:~%%c,3!" & if !c! geq 1000 set /a "d-=%%b"
                ) else set /a "d-=%%b"
        )
        set "e=00!d!" & set /p "=!e:~-3!"<nul
        set "c=" & set /a "f=d*d/1000"
        for /l %%b in (0 3 %%a) do (
        set /a "e=(!a:~%%b,3!*d<<1)+!b:~%%b,3!+f","f=e/1000","e%%=1000"
        set "e=  !e!" & set "c=!c!!e:~-3!"
        )
        set /a "e=(d*d)%%1000" & set "e=  !e!" & set "b=000!e:~-3!!c!"
        set "e=  !d!" & set "a=!e:~-3!!a!"
)
echo. & pause & exit /bCOPY
1

评分人数

返回列表