标题: [数值计算] 批处理开平方(约8位有效数字) [打印本页]
作者: 梦想种子 时间: 2008-4-5 11:24 标题: 批处理开平方(约8位有效数字)
本帖最后由 梦想种子 于 2013-4-28 17:20 编辑
算法思路由 terse 提出。
晚辈只是扩展了可行数域和一点精度。- @echo off
- set MAX=2147483647
- :begin
- cls
- set /p n=输入待开方数(1~%MAX%):
- set a=2
- set r=
- :int_part
- set /a old_a=a,a=(n/a+a)/2
- if %old_a% lss %a% goto int_part
- set /a delta=old_a-a
- if %delta% gtr 1 goto int_part
- ::prepare
- set /a near_n=a*a
- if %near_n% equ %n% goto end
- set /a t=n-near_n,u=a
- :dec_part
- set /a t*=100,d=10,tol_d=MAX/(u*20)
- if %tol_d% lss 9 goto end
- if %t% lss 0 goto end
- :try_d
- set /a d-=1,v=d*(d+u*20)
- if %v% gtr %t% goto try_d
- set /a t-=v,u=u*10+d
- set r=%r%%d%
- goto dec_part
- :end
- if "%r%" neq "" set a=%a%.%r%
- echo 结果:%a%
- pause>nul
- goto begin
复制代码
2013.4.28更新:提高了被开方数定义域,提高了低段数字的精度,修正一些bug。
作者: 梦想种子 时间: 2008-4-5 15:27
较早时写了一个:- @echo off
- setlocal enabledelayedexpansion
- title 开平方
- echo 请输入需要开平方的数字:
- set a=2
- set comp=99999
- set /p k=
- for /l %%i in (1,1,9) do (
- if "!k:~%%i,1!" == "" (
- set len=%%i
- goto begin
- ))
- :begin
- set /a t=len%%2
- if not %t% equ 0 set /a len+=1
- set /a len=len/2
- :acr
- set /a a=(k/a+a)/2
- set /a m=a*a
- set /a t=a-!comp:~0,%len%!
- if %m% gtr %k% goto acr
- if %m:-=% neq %m% goto acr
- if %t% gtr 0 goto acr
- set /a r=(k-m)*5000/a
- set r=0000%r%
- echo 结果:%a%.%r:~-4,-1%
- 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 |