您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

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

51自学网 2021-10-30 22:14:28
  python
这篇教程使用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快速绘制海报地图
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。