欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python手工計(jì)算x的算數(shù)平方根,來自中國古人的數(shù)學(xué)智慧

 更新時(shí)間:2021年09月02日 12:07:59   作者:Hann Yang  
本篇采用的計(jì)算方法既非二分法也非牛頓迭代法,而是把中國古代的手工計(jì)算平方根的方法轉(zhuǎn)成代碼來完成。代碼有點(diǎn)煩雜,算是拋磚引玉吧,期待高手們寫出更好的代碼來

代碼 

sqrt(x, w=20, Float=False)
x 為非負(fù)實(shí)數(shù),允許科學(xué)計(jì)數(shù)法
w 是當(dāng)sqrt(x)為無理數(shù)或結(jié)果的小數(shù)部分很長時(shí)的最大位數(shù)。默認(rèn)w=20
Float 當(dāng)Float=True輸出浮點(diǎn)數(shù),w設(shè)置如超出float精度則失效。默認(rèn)輸出字符串類型

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

原理

據(jù)說這個(gè)平方根計(jì)算法出自《九章算術(shù)》,成書在公元一世紀(jì)前后,總結(jié)了先秦到兩漢的古代數(shù)學(xué)成就。古代數(shù)學(xué)家也真是鬼才,怎么想出來的?

操作過程:

小數(shù)點(diǎn)前后2位2位的隔開,不足2位用0補(bǔ)。然后首位試開方,第二位開始反復(fù)用公式 (Qn+1 * 20 + Qn) * Qn來試商 ; 下一結(jié)果Qn+2 = 10*Qn+1 + Qn。具體流程請(qǐng)自行搜索了解,大致流程如下:

測試 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
>>> 

科學(xué)計(jì)算法測試

>>> 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萬位的耗時(shí)測試

>>> 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手工計(jì)算x的算數(shù)平方根,更多關(guān)于Python手工計(jì)算x的算數(shù)平方根的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 用python寫一個(gè)帶有g(shù)ui界面的密碼生成器

    用python寫一個(gè)帶有g(shù)ui界面的密碼生成器

    這篇文章主要介紹了用python寫一個(gè)帶有g(shù)ui界面的密碼生成器,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • 對(duì)python字典元素的添加與修改方法詳解

    對(duì)python字典元素的添加與修改方法詳解

    今天小編就為大家分享一篇對(duì)python字典元素的添加與修改方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python FFT合成波形的實(shí)例

    Python FFT合成波形的實(shí)例

    今天小編大家分享一篇Python FFT合成波形的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python進(jìn)階之尾遞歸的用法實(shí)例

    Python進(jìn)階之尾遞歸的用法實(shí)例

    本篇文章主要介紹了Python進(jìn)階之尾遞歸的用法實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • python模塊的安裝以及安裝失敗的解決方法

    python模塊的安裝以及安裝失敗的解決方法

    Python 模塊(Module),是一個(gè) Python 文件,以 .py 結(jié)尾,包含了 Python 對(duì)象定義和Python語句。模塊讓你能夠有邏輯地組織你的 Python 代碼段。把相關(guān)的代碼分配到一個(gè)模塊里能讓你的代碼更好用,更易懂。模塊能定義函數(shù),類和變量,模塊里也能包含可執(zhí)行的代碼
    2021-11-11
  • Python實(shí)現(xiàn)自動(dòng)整理表格的示例代碼

    Python實(shí)現(xiàn)自動(dòng)整理表格的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)自動(dòng)整理表格的功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Python中的json內(nèi)置庫詳解

    Python中的json內(nèi)置庫詳解

    這篇文章主要介紹了Python中的json內(nèi)置庫詳解,在學(xué)習(xí)做自動(dòng)化測試的過程中,python 里有一個(gè)內(nèi)置的 json 庫,必須要學(xué)習(xí)好,json 是用于存儲(chǔ)和交換數(shù)據(jù)的語法,是一種輕量級(jí)的數(shù)據(jù)交換式使用場景,需要的朋友可以參考下
    2023-08-08
  • Python3.5裝飾器典型案例分析

    Python3.5裝飾器典型案例分析

    這篇文章主要介紹了Python3.5裝飾器,結(jié)合實(shí)例形式分析了裝飾器修飾有參數(shù)函數(shù)、裝飾器修飾函數(shù)參數(shù)等情況相關(guān)使用技巧,需要的朋友可以參考下
    2019-04-04
  • Python?sklearn轉(zhuǎn)換器估計(jì)器和K-近鄰算法

    Python?sklearn轉(zhuǎn)換器估計(jì)器和K-近鄰算法

    這篇文章主要介紹了Python?sklearn轉(zhuǎn)換器估計(jì)器和K-近鄰算法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Python實(shí)現(xiàn)的多進(jìn)程和多線程功能示例

    Python實(shí)現(xiàn)的多進(jìn)程和多線程功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的多進(jìn)程和多線程功能,結(jié)合實(shí)例形式分析了Python多線程與多進(jìn)程實(shí)現(xiàn)分布式系統(tǒng)功能相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05

最新評(píng)論