PyPrintPi på en Raspberry Pi (13 / 23 steg)
Steg 13: Skapa kod att använda med termoskrivaren
Vi kan fortfarande använda bättre metoder för att beräkna π som Chudnovsky algoritmen eller Gauss – Legendre algoritmen, men matematik börjar bli ett mycket mer komplicerat och jag föredrar att använda metoder som jag förstår. Eftersom vi kommer att kunna skriva ut resultaten och skrivarens hastighet är begränsad, behöver vårt program bara skriva ut så fort som skrivaren.
Vi har två huvudalternativ för ett program som skriver ut π: antingen beräknas π till ett stort antal decimaler och sedan skriver ut det, eller programmet kan skriva ut de tio första siffrorna i π medan beräkningen av de närmaste tio siffrorna i π. Jag bestämde mig att beräkna π först sedan skriva ut det, eftersom detta kräver mycket mindre arbete.
För att vara tryckt våra program behov att skapa ett textdokument med värdet på π i det (gauss_pi_method_save_to_text.py):
från decimal import *
Importera tid
def gauss_pi_method():
Return 4*(12*arctan(18) + 8*arctan(57) - 5*arctan(239))
def arctan(x):
en = 10 ** getcontext () .prec
xSquaredPlusOne = (x * x) + 1
fract = (x * en) / / xSquaredPlusOne
Total = fract
numurator_num = 2
medan 1:
nämnaren = (numurator_num + 1) * xSquaredPlusOne
fract * = numurator_num
fract = fract / / nämnare
om fract == 0:
Break
totala += fract
numurator_num += 2
återgå Decimal(Decimal(total)/Decimal(one))
medan 1:
#Asks användaren hur många decimaler som de vill ha det svara för att ges till
decimaler = int (input ("Ange hur många decimaler vill du ha svaret ges till:")) + 1
start_time = time.time()
getcontext () .prec = decimaler + 5 #sets precision med 4 fler decimaler än bad om.
PiEst = gauss_pi_method() #computes pi
getcontext () .prec = decimaler #this kodblock rundor pi antal decimaler som bad om
PiEst = + PiEst
end_time = time.time()
#this block sparar våra värdet på pi till pi.txt
f = öppna ("pi.txt", "w")
f.write(Str(PiEst))
f.Close()
#next line skriver ut resultaten
skriva ut ("Pi till" + str(decimals-1) + "decimaler är:" + str(PiEst))
skriva ut ("algoritmen sprang i %s sekunder" % (time.time() - starttid))
Det kommer också att vara mycket enklare att koda ett slutligt skript om vi kan skapa ett litet bibliotek med funktionen Gauss metod och funktionen arctan. Detta kommer att tillåta oss att kalla dem från valfritt program i samma katalog. När vi skapar detta bibliotek vi behöver ändra matas funktionen Gauss metod så sparar det ut till en textfil. Skapa ett bibliotek i Python är ganska lätt, vi behöver bara skapa en Python-fil med alla funktioner vi vill ta med, det är det!
Här är biblioteket (gauss_pi_lib.py):
från decimal import *
def gauss_pi_method(decimals):
getcontext () .prec = decimaler + 10 #sets precision med 10 fler decimaler än bad om.
PI = 4*(12*arctan(18) + 8*arctan(57) - 5*arctan(239))
getcontext () .prec = decimaler #this kodblock rundor pi antal decimaler som bad om
PI = + pi
f = öppna ('pi.txt', 'w') #this block sparar våra värdet på pi till pi.txt
f.write(Str(PI))
f.Close()
returnera
def arctan(x):
en = 10 ** getcontext () .prec
xSquaredPlusOne = (x * x) + 1
fract = (x * en) / / xSquaredPlusOne
Total = fract
numurator_num = 2
medan 1:
nämnaren = (numurator_num + 1) * xSquaredPlusOne
fract * = numurator_num
fract = fract / / nämnare
om fract == 0:
Break
totala += fract
numurator_num += 2
återgå Decimal(Decimal(total)/Decimal(one))
Observera att när du skapar ett bibliotek kan du lägga alla beroenden längst upp, utanför någon funktion. Nu har vi ett bibliotek och vi kan använda dess funktioner genom att kalla det från ett annat program (gauss_pi_lib_test.py):
importera gauss_pi_lib
Importera tid
medan 1:
#Asks användaren hur många decimaler som de vill ha det svara för att ges till
decimaler = int (input ("Ange hur många decimaler vill du pi för:")) + 1
start_time = time.time()
gauss_pi_lib.gauss_pi_method(decimals)
end_time = time.time()
#next raden kopierar resultat från pi.txt
f = öppna ('pi.txt', 'r')
PI = f.read()
f.Close()
skriva ut ("Pi till" + str(decimals-1) + "decimaler är:" + pi)
skriva ut ("algoritmen sprang i %s sekunder" % (time.time() - starttid))
I detta program "import gauss_pi_lib", importerar biblioteket vi just gjort. Om du kör programmet hittar du körs det samma som tidigare med undantaget att det kör omkring två gånger så långsamt. Tyvärr måste vi acceptera denna förlust i hastighet som vi kommer att använda Python 2 för att prata till skrivaren och det enklaste sättet att kommunicera mellan Python 2 och 3 är genom att spara ett program utdata till en txt-fil i ett program sedan läsa .txt filen i ett annat program körs ett annat språk.