• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    使用Python手工计算x的算数平方根,来自中国古人的数学智慧

    代码 

    sqrt(x, w=20, Float=False)
    x 为非负实数,允许科学计数法
    w 是当sqrt(x)为无理数或结果的小数部分很长时的最大位数。默认w=20
    Float 当Float=True输出浮点数,w设置如超出float精度则失效。默认输出字符串类型

    def sqrt(x,w=20,Float=False):
        if x==0 or x==1:return str(x*1.0)
        if x0: raise ValueError('x>=0')
        s,power = str(x),0
        t = s.find('e')
        if t!=-1:
            s=s.split('e')
            s[1] = int(s[1])
            if int(s[1])%2:
                tmp = str(s[0])
                s = [tmp[0]+tmp[2]+tmp[1]+tmp[3:],s[1]-1]
            s,power = *s,
        t = s.find('.')
        if t!=-1:
            if t%2: s='0'+s
            if not len(s)%2: s+='0'
        else:
            if len(s)%2: s='0'+s
        s = s.split('.')
        t = t,len(s[0])//2
        try: s = s[0]+s[1]
        except: s = s[0]
        s = [s[i:i+2] for i in range(len(s)) if not i%2][::-1]
        n = int(s.pop())
        i = 1
        while n>0 and i*i=n: i+=1
        i -= 1
        m,n = str(n-i*i),i
        div = lambda x,y:[(i,y-(20*x+i)*i) for i in range(10) if y>=(20*x+i)*i]
        dot,ret = t[1],str(n)
        while w>0:
            dot -= 1;
            if dot==0: ret += '.'
            if dot=0: w-=1
            m += s.pop() if s else '00'
            q,d = div(n,int(m))[-1]
            m,n = str(d),10*n+q
            ret += str(q)
            if len(s)==0 and d==0:
                if ret.find('.')==-1: ret += '.0'
                break
        if power!=0:
            if power>0: ret += 'e+0'+str(power//2)
            else: ret += 'e-0'+str(power//2)[1:]
        if Float: ret = float(ret)
        return ret

    原理

    据说这个平方根计算法出自《九章算术》,成书在公元一世纪前后,总结了先秦到两汉的古代数学成就。古代数学家也真是鬼才,怎么想出来的?

    操作过程:

    小数点前后2位2位的隔开,不足2位用0补。然后首位试开方,第二位开始反复用公式 (Qn+1 * 20 + Qn) * Qn来试商 ; 下一结果Qn+2 = 10*Qn+1 + Qn。具体流程请自行搜索了解,大致流程如下:

    测试 sqrt(n)与n**0.5

    >>> for i in range(17):
    	print(f'sqrt({i})={sqrt(i)}')
    	print(f'{i}**0.5={i**0.5}')	
    sqrt(0)=0.0
    0**0.5=0.0
    sqrt(1)=1.0
    1**0.5=1.0
    sqrt(2)=1.41421356237309504880
    2**0.5=1.4142135623730951
    sqrt(3)=1.73205080756887729352
    3**0.5=1.7320508075688772
    sqrt(4)=2.0
    4**0.5=2.0
    sqrt(5)=2.23606797749978969640
    5**0.5=2.23606797749979
    sqrt(6)=2.44948974278317809819
    6**0.5=2.449489742783178
    sqrt(7)=2.64575131106459059050
    7**0.5=2.6457513110645907
    sqrt(8)=2.82842712474619009760
    8**0.5=2.8284271247461903
    sqrt(9)=3.0
    9**0.5=3.0
    sqrt(10)=3.16227766016837933199
    10**0.5=3.1622776601683795
    sqrt(11)=3.31662479035539984911
    11**0.5=3.3166247903554
    sqrt(12)=3.46410161513775458705
    12**0.5=3.4641016151377544
    sqrt(13)=3.60555127546398929311
    13**0.5=3.605551275463989
    sqrt(14)=3.74165738677394138558
    14**0.5=3.7416573867739413
    sqrt(15)=3.87298334620741688517
    15**0.5=3.872983346207417
    sqrt(16)=4.0
    16**0.5=4.0
    >>> 
    >>> 
    >>> sqrt(2,Float=True) == 2**0.5
    True
    >>> sqrt(3,Float=True) == 3**0.5
    True
    >>> sqrt(123,Float=True) == 123**0.5
    True
    >>> 

    科学计算法测试

    >>> sqrt(1.23e+50)
    '1.10905365064094171620e+025'
    >>> 1.23e+50**0.5
    1.1090536506409416e+25
    >>> sqrt(1.23e+51)
    '3.50713558335003638336e+025'
    >>> 1.23e+51**0.5
    3.5071355833500364e+25
    >>> sqrt(1.23e-50)
    '1.10905365064094171620e-025'
    >>> 1.23e-50**0.5
    1.1090536506409418e-25
    >>> sqrt(1.23e-51)
    '3.50713558335003638336e-026'
    >>> 1.23e-51**0.5
    3.5071355833500365e-26
    >>> 

    精度测试

    >>> sqrt(2,100)
    '1.41421356237309504880168872420969807856967187537694
    80731766797379907324784621070388503875343276415727'
    >>> sqrt(10,500)
    '3.16227766016837933199889354443271853371955513932521
    68268575048527925944386392382213442481083793002951
    87347284152840055148548856030453880014690519596700
    15390334492165717925994065915015347411333948412408
    53169295770904715764610443692578790620378086099418
    28371711548406328552999118596824564203326961604691
    31433612894979189026652954361267617878135006138818
    62785804636831349524780311437693346719738195131856
    78403231241795402218308045872844614600253577579702
    82864402902440797789603454398916334922265261206779'
    >>> sqrt(123,2000)
    '11.09053650640941716205160010260993291846337674245402
    00228773128390850016331012896052334560795952104923
    97609680678955280792187905933115292625456231839306
    77251943912251383176574941199469582196976000438135
    40867472202696805822192936674286399297485980945076
    78295660716567970352602444301464684924479636459099
    14867193001802834979182445692668356613065880869548
    25999929108256938950212808340223106891096223696155
    58407975630369894453553840958193501976809032496435
    98351605065147790119568667920441106521130541775416
    88403618227856731042118992185281429619080341919784
    91236339758444278806715795552342614568993355758259
    00257454016962686033789212494918951906742724387717
    86816775058970553110606825772728456503631816127185
    97236514403953501043370950197906664648656587402375
    47456007486620199478701365589929806411967684259454
    52983826062182085142259698311212942126801021825240
    49746216571370198706996668818361845968235199845816
    69902568378075870406180767774203205467306930309438
    16832697339952984981648138573158982379175644441470
    50866454616067044997958059525209028336061119869487
    42330123683852090419874148218422184948658174234109
    57266920859313915279433828848348895422861007776818
    60008218306382698626583716405660864687800252861028
    31434598682004467042622580768146827595778429365752
    19552960734589394860581552514632178318401717998004
    12904477515916582731378709757426533231624676879051
    21277303475419893966421915682962327965202183939540
    07041575389626966661084388718863067485822881867488
    00698329255619212758441301451712107894934052042668
    13620261632356745839351541875140890682676375675084
    74266141686980135645708807796240849684849035273656
    15026469136389861472142022294507047846522584450886
    83823021978858519029304962564972861464819539784518
    43062402845984165814550404820570869649363216162428
    32571582506529019502195720558586845830492641836612
    65156560044594234298289454649568716622838760718998
    14917847213523793754337786561375901264942957378010
    57481468928695787589958271831183026476218342365982
    72020291818311722410861264031411990033164594115086'
    >>> 

    1000位到1万位的耗时测试

    >>> from time import time
    >>> for i in range(1,11):
    	t = time()
    	s = sqrt(2,i*1000)
    	print(i*1000,':',time()-t) 
    1000 : 0.09099745750427246
    2000 : 0.5609970092773438
    3000 : 1.7489948272705078
    4000 : 3.7850000858306885
    5000 : 7.239997863769531
    6000 : 12.108997106552124
    7000 : 19.044997692108154
    8000 : 28.065003395080566
    9000 : 39.57198643684387
    10000 : 54.04999876022339
    >>> 

    以上就是使用Python手工计算x的算数平方根,更多关于Python手工计算x的算数平方根的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • Python中利用sqrt()方法进行平方根计算的教程
    • Python求算数平方根和约数的方法汇总
    • Python求解平方根的方法
    • Python基于二分查找实现求整数平方根的方法
    • python开根号实例讲解
    上一篇:Django零基础入门之运行Django版的hello world
    下一篇:利用Python快速绘制海报地图
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    使用Python手工计算x的算数平方根,来自中国古人的数学智慧 使用,Python,手工,计算,的,