本帖最后由 caruko 于 2011-5-26 14:37 编辑
按照上面的算法,我也放一个开方代码。
32位限制,精确度在5位左右。
修改了一个数值接近MAX时,导致变量k为空的,无法输出结果的小错误。- @echo off&SETLOCAL ENABLEDELAYEDEXPANSION
- ::最大被开方数,2147483647 < 2^31
- ::最大开方数, < 2^16
- ::每次都将输入数值增加10^2n次,尽量增加到接近MAX的数,
- ::检测输入
- :loop
- 2>nul set /a 1/%1 &&(set "input=%1")||(set /p input=请输入被开方数字:)
- 2>nul set /a 1/input ||goto :loop
- call :kf !input!
- goto :eof
-
- :kf
- setlocal
- ::在溢出范围内提高位数,增加精确度。
- set /p=被开方数:!input!,结果:<nul
- set /a input=%1,cs=1
- for /l %%i in (1,1,8) do (
- set /a cs*=10
- if "!cs:00=!"=="1" (
- set /a x=input*cs,y=x/cs
- if !input! equ !y! set /a tp=x,k=%%i/2
- ))
- if "!tp!"=="" (
- set /a k=0
- ) else (
- set /a input=tp
- )
- :: 检测被开方数2进制的位数。
- set "ofset="
- for /l %%i in (0,1,31) do (
- set /a v=1"<<"%%i
- if %%i equ 31 set /a v=v+1&set v=!v:-=!
- if not defined ofset if !v! gtr !input! set /a ofset=%%i-1
- )
- if not defined ofset (
- echo,输入数字超标!
- exit /b -1
- )
- set /a kofset=ofset/2,v=0
- ::求被开方数,整数部分。
- for /l %%i in (!kofset!,-1,0) do (
- set /a v+=1"<<"%%i,flag=v*v
- if !flag! gtr !input! set /a v-=1"<<"%%i
- )
- for /f %%a in ("!k!") do set ecode=!v:~0,-%%a!.!v:~-%%a!
- if !k! equ 0 set ecode=!v!.0
- echo,!ecode!
- endlocal
复制代码
|