这篇教程使用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 x<0: 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.00**0.5=0.0sqrt(1)=1.01**0.5=1.0sqrt(2)=1.414213562373095048802**0.5=1.4142135623730951sqrt(3)=1.732050807568877293523**0.5=1.7320508075688772sqrt(4)=2.04**0.5=2.0sqrt(5)=2.236067977499789696405**0.5=2.23606797749979sqrt(6)=2.449489742783178098196**0.5=2.449489742783178sqrt(7)=2.645751311064590590507**0.5=2.6457513110645907sqrt(8)=2.828427124746190097608**0.5=2.8284271247461903sqrt(9)=3.09**0.5=3.0sqrt(10)=3.1622776601683793319910**0.5=3.1622776601683795sqrt(11)=3.3166247903553998491111**0.5=3.3166247903554sqrt(12)=3.4641016151377545870512**0.5=3.4641016151377544sqrt(13)=3.6055512754639892931113**0.5=3.605551275463989sqrt(14)=3.7416573867739413855814**0.5=3.7416573867739413sqrt(15)=3.8729833462074168851715**0.5=3.872983346207417sqrt(16)=4.016**0.5=4.0>>> >>> >>> sqrt(2,Float=True) == 2**0.5True>>> sqrt(3,Float=True) == 3**0.5True>>> sqrt(123,Float=True) == 123**0.5True>>> 科学计算法测试>>> sqrt(1.23e+50)'1.10905365064094171620e+025'>>> 1.23e+50**0.51.1090536506409416e+25>>> sqrt(1.23e+51)'3.50713558335003638336e+025'>>> 1.23e+51**0.53.5071355833500364e+25>>> sqrt(1.23e-50)'1.10905365064094171620e-025'>>> 1.23e-50**0.51.1090536506409418e-25>>> sqrt(1.23e-51)'3.50713558335003638336e-026'>>> 1.23e-51**0.53.5071355833500365e-26>>> 精度测试>>> sqrt(2,100)'1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727'>>> sqrt(10,500)'3.16227766016837933199889354443271853371955513932521682685750485279259443863923822134424810837930029518734728415284005514854885603045388001469051959670015390334492165717925994065915015347411333948412408531692957709047157646104436925787906203780860994182837171154840632855299911859682456420332696160469131433612894979189026652954361267617878135006138818627858046368313495247803114376933467197381951318567840323124179540221830804587284461460025357757970282864402902440797789603454398916334922265261206779'>>> sqrt(123,2000)'11.09053650640941716205160010260993291846337674245402002287731283908500163310128960523345607959521049239760968067895528079218790593311529262545623183930677251943912251383176574941199469582196976000438135408674722026968058221929366742863992974859809450767829566071656797035260244430146468492447963645909914867193001802834979182445692668356613065880869548259999291082569389502128083402231068910962236961555840797563036989445355384095819350197680903249643598351605065147790119568667920441106521130541775416884036182278567310421189921852814296190803419197849123633975844427880671579555234261456899335575825900257454016962686033789212494918951906742724387717868167750589705531106068257727284565036318161271859723651440395350104337095019790666464865658740237547456007486620199478701365589929806411967684259454529838260621820851422596983112129421268010218252404974621657137019870699666881836184596823519984581669902568378075870406180767774203205467306930309438168326973399529849816481385731589823791756444414705086645461606704499795805952520902833606111986948742330123683852090419874148218422184948658174234109572669208593139152794338288483488954228610077768186000821830638269862658371640566086468780025286102831434598682004467042622580768146827595778429365752195529607345893948605815525146321783184017179980041290447751591658273137870975742653323162467687905121277303475419893966421915682962327965202183939540070415753896269666610843887188630674858228818674880069832925561921275844130145171210789493405204266813620261632356745839351541875140890682676375675084742661416869801356457088077962408496848490352736561502646913638986147214202229450704784652258445088683823021978858519029304962564972861464819539784518430624028459841658145504048205708696493632161624283257158250652901950219572055858684583049264183661265156560044594234298289454649568716622838760718998149178472135237937543377865613759012649429573780105748146892869578758995827183118302647621834236598272020291818311722410861264031411990033164594115086'>>> 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.090997457504272462000 : 0.56099700927734383000 : 1.74899482727050784000 : 3.78500008583068855000 : 7.2399978637695316000 : 12.1089971065521247000 : 19.0449976921081548000 : 28.0650033950805669000 : 39.5719864368438710000 : 54.04999876022339>>> 以上就是使用Python手工计算x的算数平方根,更多关于Python手工计算x的算数平方根的资料请关注51zixue.net其它相关文章! Django零基础入门之运行Django版的hello world 利用Python快速绘制海报地图 |