Metodele rădăcinii pătrate sunt algoritmi de calcul pentru calcularea valorilor aproximative ale rădăcinilor pătrate principale (sau nenegative) (notate de obicei ca , sau ) ale unui număr real. Din punct de vedere aritmetic, aceasta înseamnă că dacă un număr este dat , procedura găsește un număr care, înmulțit cu el însuși, dă . Din punct de vedere algebric, aceasta înseamnă procedura pentru găsirea unei rădăcini nenegative a unei ecuații . Din punct de vedere geometric, aceasta înseamnă construirea unei laturi a unui pătrat cu o zonă dată.
Orice număr real are două rădăcini [1] . Valoarea principală a rădăcinii pătrate a majorității numerelor este un număr irațional cu o succesiune infinită de cifre zecimale. Ca rezultat, reprezentarea zecimală a oricărei astfel de rădăcini pătrate poate fi calculată doar aproximativ la precizie finită (locuri zecimale). Totuși, chiar dacă luăm rădăcina pătrată a unui număr întreg, astfel încât rezultatul să aibă o reprezentare finită, unele dintre procedurile utilizate pentru calcularea rădăcinii pot returna doar o serie de aproximări cu precizie crescândă.
Reprezentarea fracțională continuă a unui număr real poate fi folosită în locul expansiunii zecimale sau binare, iar această reprezentare are proprietatea că rădăcina pătrată a oricărui număr rațional (care nu este un pătrat perfect) are o perioadă, adică o expansiune periodică similară modului numerele raționale au expansiunea repetitivă a sistemului numeric zecimal.
Cele mai frecvent acceptate metode analitice sunt iterative și constau în doi pași: găsirea unei valori de pornire adecvate și apoi rafinarea iterativă până la atingerea unui anumit criteriu de oprire. Valoarea de început poate fi orice număr, dar dacă este mai aproape de valoarea finală, vor fi necesare mai puține iterații. Cea mai cunoscută astfel de metodă, și chiar mai convenabilă pentru programare, este metoda lui Newton, care se bazează pe calculul derivatei. Mai multe metode, cum ar fi divizarea manuală Horner sau extinderea în serie, nu necesită o valoare inițială. În unele aplicații, este necesar să se găsească rădăcina pătrată întreg , care este rădăcina pătrată rotunjită la cel mai apropiat număr întreg (în acest caz, poate fi utilizată o procedură modificată).
Metoda utilizată depinde de modul în care va fi utilizat rezultatul (adică de cât de precis trebuie să fie rezultatul) și de ce instrumente sunt disponibile. Metodele pot fi împărțite aproximativ în acelea care pot fi realizate mental, care necesită un creion și hârtie, sau cele care sunt implementate ca program și rulează pe computere sau alte dispozitive de calcul. Viteza de convergență (câte iterații vor fi necesare pentru a obține o precizie dată), complexitatea de calcul a operațiilor individuale (cum ar fi diviziunea) sau iterațiile și distribuția erorilor (acuratețea rezultatului) pot fi luate în considerare.
Procedurile pentru găsirea rădăcinilor pătrate (în special, rădăcina lui 2) sunt cunoscute cel puțin încă din timpul Babilonului antic (secolul al XVII-lea î.Hr.). Metoda lui Heron din Egiptul secolului I a fost primul algoritm verificabil pentru calcularea rădăcinii pătrate. Metodele analitice moderne au început să fie dezvoltate după adoptarea cifrelor arabe în Europa de Vest în perioada Renașterii timpurii . În zilele noastre, aproape toate dispozitivele de calcul au o funcție de rădăcină pătrată rapidă și precisă ca un limbaj de programare încorporat, funcție de bibliotecă sau declarație hardware care se bazează pe procedurile descrise mai jos.
Mulți algoritmi iterativi de rădăcină pătrată necesită o valoare aleatorie inițială. Această valoare trebuie să fie un număr pozitiv diferit de zero. Trebuie să fie între 1 și , numărul a cărui rădăcină pătrată o căutăm, deoarece rădăcina pătrată trebuie să fie în aceste limite. Dacă valoarea inițială este foarte departe de rădăcină, algoritmul va avea nevoie de mai multe iterații. Dacă începeți cu (sau cu ), se va rezolva despre iterații suplimentare doar pentru a obține ordinea rădăcinii. Prin urmare, este util să aveți o estimare aproximativă a rădăcinii, care poate avea o precizie slabă, dar este ușor de calculat. În general, cu cât estimarea este mai precisă, cu atât convergența este mai rapidă. Pentru metoda lui Newton (numită și metoda babiloniană sau a lui Heron), o valoare inițială puțin mai mare decât rădăcina oferă o convergență mai rapidă decât o valoare inițială mai mică decât rădăcina.
În general, estimarea este considerată pe un interval arbitrar în care se știe că conține o rădăcină (cum ar fi ). Obținerea unei estimări mai bune implică fie obținerea unor limite mai înguste pe interval, fie o aproximare funcțională mai bună a . Aceasta din urmă înseamnă, de obicei, utilizarea polinoamelor de ordin superior pentru aproximare, deși nu toate aproximările folosesc polinoame. Metodele comune de estimare sunt scalare, liniare, hiperbolice și logaritmice. Sistemul zecimal este folosit de obicei pentru estimarea mentală sau pe hârtie. Sistemul de numere binare este mai potrivit pentru evaluările computerizate. La evaluare, exponentul și mantisa sunt de obicei tratate separat.
De obicei, numărul este exprimat în formă exponențială ca , unde , și n este un număr întreg, apoi o estimare a posibilei rădăcini pătrate poate fi , unde .
Estimări scalareMetodele scalare împart întreaga gamă în binuri, iar scorul din fiecare bin este reprezentat de un singur număr. Dacă intervalul este tratat ca un singur interval, atunci media aritmetică (5.5) sau media geometrică () sunt estimări acceptabile. Estimările absolute și relative pentru aceste estimări vor diferi. În general, un singur număr va fi foarte inexact. Mai mult estimările precise împart intervalul în două sau mai multe intervale, dar estimarea scalară continuă să fie foarte aproximativă.
Pentru două intervale împărțite geometric, rădăcina pătrată poate fi estimată ca [2] .
Această estimare are o eroare absolută maximă la punctul = 100 și o eroare relativă maximă de 100% la punctul = 1.
De exemplu, pentru cu o descompunere , scorul va fi . , cu o eroare absolută de 246 și o eroare relativă de aproape 70%.
Estimare liniarăCea mai bună estimare și metoda standard este aproximarea liniară a funcției pe un arc mic. Dacă, ca mai sus, exponentul este extras din numărul , iar intervalul este redus la , puteți utiliza o secantă sau o tangentă undeva de-a lungul arcului pentru a aproxima, dar regresia directă a celor mai mici pătrate va fi mai precisă.
Linia dreaptă, obținută prin metoda celor mai mici pătrate, minimizează distanța medie dintre estimare și valoarea funcției. Ecuația ei este . După transformarea și rotunjirea coeficienților pentru a simplifica calculele, obținem
Aceasta este cea mai bună estimare medie care poate fi obținută printr-o încercare de aproximare liniară a funcției în intervalul . Estimarea are o eroare absolută maximă de 1,2 la punctul a=100 și o eroare relativă maximă de 30% la punctele S=1 și 10 [3] .
Pentru a împărți la 10, scădeți unul din exponent sau, la figurat vorbind, mutați virgulă zecimală cu o poziție la stânga. Pentru această formulă, orice constantă adăugată egală cu 1 plus un mic increment oferă o estimare satisfăcătoare, deci nu este nevoie să memorați numărul exact. Aproximarea (rotunjită sau nerotunjită) folosind o linie dreaptă care scade regiunea în termeni de precizie nu dă mai mult de un semn corect. Eroarea relativă este mai mare de 1/2 2 , deci oferă mai puțin de 2 biți de informație. Precizia este sever limitată, deoarece regiunea se întinde pe două ordine de mărime, ceea ce este destul de mare pentru acest tip de estimare.
O estimare semnificativ mai bună poate fi obținută folosind o aproximare liniară pe bucăți, adică folosind mai multe segmente care aproximează subarcul arcului original. Cu cât se folosesc mai multe segmente, cu atât este mai bună aproximarea. Cea mai frecventă utilizare a tangentelor. Punctul critic este cum să împărțiți arcul și unde să plasați punctele de atingere. O metodă eficientă de împărțire a arcului de la y=1 la y=100 este geometrică - pentru două intervale, limita intervalului este rădăcina pătrată a intervalului original, 1 * 100, adică și . Pentru trei intervale vor exista rădăcini cubice - , și , și așa mai departe. Pentru două intervale, acesta este un număr foarte convenabil. Este ușor să obțineți linii tangente în punctele de contact și . Ecuațiile lor sunt: și . Inversând ecuațiile, obținem că rădăcinile pătrate sunt egale cu și . Apoi pentru :
Valorile absolute maxime sunt în limitele drepte ale intervalelor, la punctele a=10 și 100 și sunt egale cu 0,54 și, respectiv, 1,7. Erorile relative maxime apar la sfârşitul intervalelor, la punctele a=1, 10 şi 100, şi sunt egale cu 17%. 17% sau 0,17. Sunt mai mari decât 1/10, deci metoda oferă o precizie mai mică de o cifră semnificativă.
Estimare hiperbolicaÎn unele cazuri, estimarea hiperbolică poate fi validă, deoarece hiperbola este, de asemenea, o curbă convexă și poate să se afle de-a lungul arcului Y = x 2 mai bine decât o linie dreaptă. Estimatorul hiperbolic este mai dificil din punct de vedere computațional, deoarece necesită împărțirea cu un număr în virgulă mobilă. O aproximare hiperbolică aproape optimă la x 2 pe interval este . După transformare obținem . Apoi pentru :
Diviziunea în virgulă mobilă trebuie să fie precisă până la o zecimală, deoarece toate evaluările oferă această precizie, iar o astfel de împărțire poate fi făcută mental. Estimarea hiperbolică este în medie mai bună decât estimarea scalară sau liniară. Eroarea sa absolută maximă este de 1,58 la punctul 100, iar eroarea sa relativă maximă este de 16,0% la punctul 10. Pentru cel mai rău caz a=10, scorul este 3,67. Dacă începem de la 10 și aplicăm direct iterațiile Newton-Rapson, este nevoie de două iterații, care dau 3,66, înainte de a ajunge la acuratețea estimării hiperbolice. Pentru un caz mai tipic, cum ar fi 75, estimarea hiperbolică este 8,00 și este nevoie de 5 iterații Newton-Rapson începând cu 75 pentru a obține un rezultat mai precis.
Evaluare aritmeticăO metodă similară cu aproximarea liniară pe bucăți, dar care utilizează numai operații aritmetice în loc de ecuații algebrice, folosește tabelul de înmulțire invers - rădăcina pătrată a numerelor între 1 și 100 este undeva între 1 și 10, deci știm că 25 este pătrat exact. (5 × 5) și 36 este un pătrat exact (6 × 6), apoi rădăcina pătrată a unui număr care este mai mare de 25, dar mai mic de 36 începe cu numărul 5. În mod similar, pentru numerele dintre alte pătrate. Această metodă oferă prima cifră corectă, dar acuratețea ei este doar o cifră - prima cifră a rădăcinii pătrate a lui 35, de exemplu, este 5, dar rădăcina lui 35 în sine este aproape egală cu 6.
Este mai bine să împărțiți intervalul dintre două pătrate în jumătate. Deci rădăcina oricărui număr între 25 și jumătate până la 36 (care este 30,5) evaluează la 5, alte numere mai mari de 30,5 până la 36 evaluează la 6 [4] . Procedura necesită foarte puțină aritmetică pentru a găsi mijlocul a două produse din tabel. Iată un tabel cu astfel de numere:
A | cel mai apropiat pătrat | EST. |
---|---|---|
1 la 2,5 | 1 (= 1 2 ) | unu |
2,5 până la 6,5 | 4 (= 2 2 ) | 2 |
6,5 până la 12,5 | 9 (= 3 2 ) | 3 |
12,5 până la 20,5 | 16 (= 4 2 ) | patru |
20,5 până la 30,5 | 25 (= 5 2 ) | 5 |
30,5 până la 42,5 | 36 (= 6 2 ) | 6 |
42,5 până la 56,5 | 49 (= 72 ) | 7 |
56,5 până la 72,5 | 64 (= 82 ) | opt |
72,5 până la 90,5 | 81 (= 9 2 ) | 9 |
90,5 până la 100 | 100 (= 102 ) | zece |
Operația finală va fi înmulțirea scorului k cu puterea zecilor împărțită la jumătate, astfel încât pentru ,
Metoda oferă o precizie semnificativă pentru o cifră, deoarece se rotunjește la cea mai bună cifră.
Metoda poate fi extinsă la 3 cifre semnificative în majoritatea cazurilor prin interpolarea între cele mai apropiate pătrate. Dacă , atunci este aproximativ egal cu k plus o fracție egală cu diferența dintre a și , împărțit la diferența dintre cele două pătrate:
UndeOperația finală, ca mai sus, este înmulțirea rezultatului cu puterea lui zece împărțită la jumătate
Numărul k este cifra zecimală și R este fracția care trebuie convertită în zecimală. O fracție are de obicei o cifră în numărător și una sau două cifre în numitor, astfel încât conversia la o zecimală se poate face mental.
Exemplu: găsiți rădăcina pătrată a lui 75. , deci a este 75 și n este 0. Pe baza tabelului înmulțirii, rădăcina pătrată a mantisei ar trebui să fie 8 cu o fracție deoarece , a , este prea mare. Deci k este 8 , fracția fiind reprezentarea zecimală a lui R . Fracția R are atât un numărător, cât și un numitor. 11/17 este puțin mai mic decât 12/18, care este 2/3 sau 0,67, deci 0,66 este o estimare bună (este în regulă să faci o ghicire aici, deoarece eroarea este mică). Deci valoarea rădăcinii este . √ 75 până la trei cifre semnificative ar fi 8,66, deci un scor la trei cifre semnificative este bun. Nu toate estimările care utilizează această metodă sunt atât de precise, dar sunt destul de apropiate.
Când munca este efectuată în sistem binar (să zicem, într-un procesor de calculator), este exprimată ca , unde , rădăcina pătrată poate fi estimată ca
care este o regresie cu cele mai mici pătrate pe cei 3 biți cei mai semnificativi. are o eroare absolută maximă de 0,0408 la punctul =2 și o eroare relativă maximă de 3,0% la punctul =1. Pentru calcule, o estimare rotunjită este convenabilă (deoarece coeficienții sunt puteri de 2)
[5]care are o eroare absolută maximă de 0,086 la punctul 2 și o eroare relativă maximă de 6,1% la punctele și .
Pentru că aproximarea binară dă Deoarece , estimarea dă o eroare absolută de 19 și o eroare relativă de 5,3%. Eroarea relativă este puțin mai mică decât 1/2 4 , deci aproximarea este precisă la 4+ biți.
O estimare pentru până la 8 biți poate fi obținută prin căutarea în tabel pentru cei mai semnificativi 8 biți , având în vedere că cel mai semnificativ bit este implicit în majoritatea reprezentărilor în virgulă mobilă, iar biții mai puțin semnificativi după 8 biți trebuie rotunjiți. Tabelul conține 256 de octeți de rădăcini pătrate de 8 biți precalculate. De exemplu, pentru indicele 11101101 2 , care este 1,8515625 10 în zecimală , valoarea din tabel este 10101110 2 , care este 1,359375 10 în zecimală , rădăcina pătrată a 1,8515625 10 până la 8 biți zecimale (+ 8 biți).
Poate că primul algoritm folosit pentru aproximare este metoda cunoscută sub numele de metoda babiloniană , deși nu există nicio dovadă directă, în afară de inferența ipotetică, că matematicienii babilonieni au folosit această metodă [6] . Metoda este cunoscută și sub numele de metoda lui Heron , după matematicianul grec din secolul I Heron , care a dat prima descriere explicită a metodei în lucrarea sa de 60 de ani Metrica [7] Tehnica de bază este aceea că dacă x este mai mare decât pătratul rădăcină a unui număr real nenegativ S , atunci va fi mai puțin rădăcină și invers. Deci, este rezonabil să ne așteptăm ca media acestor două numere să fie mai aproape de rădăcină (dovada formală a acestui fapt se bazează pe inegalitatea cu privire la media aritmetică, geometrică și armonică , care arată că această medie este întotdeauna mai mare decât pătratul). rădăcină, care asigură convergența). Metoda este echivalentă cu utilizarea metodei lui Newton pentru a rezolva ecuația .
Mai precis, dacă x este o estimare inițială pentru , iar eroarea din estimarea noastră este astfel încât , putem extinde parantezele și obținem
deoarece .Prin urmare, putem compensa eroarea și putem actualiza vechea noastră estimare
Deoarece eroarea calculată nu a fost exactă, va deveni următoarea noastră aproximare. Procesul de actualizare continuă până când ajungem la precizia dorită. Este un algoritm cu convergență pătratică , ceea ce înseamnă că numărul de cifre corecte ale aproximării (în linii mari) se dublează cu fiecare iterație. Funcționează așa:
Algoritmul poate fi reprezentat astfel:
Algoritmul funcționează bine și pentru numerele p - adice , dar nu poate fi folosit pentru a identifica rădăcini pătrate reale cu rădăcini pătrate p - adice. Se poate construi, de exemplu, o succesiune de numere raționale obținute prin această metodă care converge către +3 în cazul numerelor reale, dar către -3 în numerele 2-adice.
Pentru a calcula √ S , unde S = 125348, la șase cifre semnificative, utilizați metoda de estimare aproximativă descrisă mai sus
Prin urmare .
Să presupunem că x 0 > 0 și S > 0. Atunci pentru orice n x n > 0. Eroarea relativă x n este definită ca
și apoi
Acum se poate arăta că
si in consecinta
și aceasta implică convergență garantată, iar această convergență este pătratică .
Convergență în cel mai rău cazDacă folosim o metodă de estimare aproximativă cu metoda babiloniană, atunci cele mai grave cazuri de acuratețe în ordine descrescătoare sunt:
Și apoi oricum
Erorile de rotunjire slăbesc convergența. Este recomandat să stocați cel puțin o cifră suplimentară peste precizia dorită x n pentru a minimiza erorile de rotunjire.
Această metodă pentru găsirea aproximării rădăcinii pătrate a fost scrisă într-un manuscris indian antic numit manuscrisul Bakhshali . Metoda este echivalentă cu două iterații ale metodei babiloniene cu valoarea inițială x 0 . Astfel, algoritmul este convergent pătratic, ceea ce înseamnă că numărul de semne valide ale aproximării crește de aproximativ patru ori cu fiecare iterație [8] . Reprezentarea algoritmului în notație modernă este următoarea: Calculați , fie x 0 2 aproximarea inițială a rădăcinii S . Iterațiile sunt efectuate secvenţial
Aceasta poate fi folosită pentru a construi o aproximare rațională a rădăcinii pătrate, începând cu un număr întreg. Dacă este un număr întreg ales aproape de S și este diferența a cărei valoare absolută este minimizată, atunci prima iterație poate fi scrisă după cum urmează:
Metoda lui Bakhshali poate fi generalizată pentru a calcula o rădăcină arbitrară, inclusiv rădăcini fracționale [9] .
Să folosim același exemplu care a fost dat pentru metoda babiloniană. Fie Atunci prima iterație dă
În mod similar, a doua iterație dă
Aceasta este o metodă pentru găsirea secvenţială a fiecărei cifre a rădăcinii pătrate. Metoda este mai lentă decât cea babilonică, dar are unele avantaje
Bastoanele lui Napier includ facilitati suplimentare pentru realizarea acestui algoritm. Algoritmul pentru calculul a n-a rădăcină cifră cu cifră este o generalizare a acestei metode.
Luați în considerare mai întâi cazul găsirii rădăcinii pătrate a unui număr Z , care este pătratul unui număr de două cifre XY , unde X este cifra zecilor și Y este cifra unilor. Avem:
Mai întâi , să definim valoarea lui X. X este cea mai mare cifră, astfel încât X 2 nu depășește Z , din care ultimele două cifre sunt eliminate.
În următoarea iterație, conectăm o pereche de cifre înmulțind X cu 2 și punând rezultatul în poziția zecilor, apoi încercând să aflăm cu ce Y este egal cu .
Deoarece în cazul nostru răspunsul este rădăcina pătrată exactă, algoritmul se oprește.
Aceeași idee poate fi extinsă pentru a calcula o rădăcină pătrată arbitrară. Imaginați-vă că putem găsi rădăcina pătrată a lui N ca sumă a n numere pozitive astfel încât
Prin reutilizarea identității
partea dreaptă poate fi reprezentată ca
Această expresie ne permite să găsim rădăcina pătrată prin selectarea succesivă a valorilor . Să presupunem că numerele au fost deja selectate, atunci al-lea termen este dat de , unde este aproximarea găsită față de rădăcina pătrată. Acum fiecare nouă selecție trebuie să satisfacă recursiunea
deci pentru toţi la valoarea iniţială Dacă se găseşte exact rădăcina pătrată. Dacă nu, atunci suma oferă o aproximare adecvată a rădăcinii pătrate și va fi o eroare de aproximare.
De exemplu, în zecimală avem
unde sunt indicatorii de poziție a cifrelor și coeficienții . La fiecare m-a pas de calcul al rădăcinii pătrate, se găsește aproximativ o rădăcină pătrată. Mărimea și termenii însumați sunt dați de formule
Deoarece indicatorii de poziție au o putere uniformă de 10, trebuie să lucrăm doar cu perechea de cifre cele mai mari din termenul rămas la orice pas al lunei. Secțiunea de mai jos organizează această procedură.
Evident, o metodă similară poate fi folosită pentru a calcula rădăcina pătrată în orice sistem numeric, nu neapărat în zecimală. De exemplu, găsirea rădăcinii pătrate cifră cu cifră în binar este destul de eficientă, deoarece valoarea este căutată în setul mic de cifre {0,1}. Acest lucru face ca calculul să fie mai rapid, deoarece la fiecare pas valoarea este fie egală, fie egală cu . Faptul că există doar două posibilități pentru a face, de asemenea, mai ușoară alegerea unei valori la pasul al m-lea al calculului. Acest lucru se datorează faptului că trebuie doar să verificăm că pentru Dacă această condiție este îndeplinită, luăm ; iar dacă nu, atunci luăm De asemenea faptul că înmulțirea cu 2 se realizează prin deplasarea la stânga ajută la calcule.
Să scriem numărul original în formă zecimală. Numerele sunt scrise într-un mod similar cu împărțirea printr-un algoritm de împărțire lungă și , ca și în diviziunea lungă, rădăcina pătrată va fi scrisă pe linia de sus. Acum să împărțim numerele în perechi, începând cu o virgulă, pe ambele părți ale acesteia. Punctul zecimal al rădăcinii pătrate va fi pe punctul zecimal al pătratului. O cifră rădăcină pătrată este scrisă peste o pereche de cifre rădăcină pătrată.
Începând din poziția extremă din stânga, efectuăm următoarea procedură pentru fiecare pereche de cifre:
Aflați rădăcina pătrată a lui 152,2756.
1 2. 3 4 / \/ 01 52.27 56 01 1*1 <= 1 < 2*2 x = 1 01 y = x*x = 1*1 = 1 00 52 22*2 <= 52 < 23*3 x = 2 00 44 y = (20+x)*x = 22*2 = 44 08 27 243*3 <= 827 < 244*4 x = 3 07 29 y = (240+x)*x = 243*3 = 729 98 56 2464*4 <= 9856 < 2465*5 x = 4 98 56 y = (2460+x)*x = 2464*4 = 9856 00 00 Se oprește algoritmul: Răspuns 12.34Această secțiune folosește formalismul secțiunii Calcularea cifrei cu cifre , cu modificări minore, că , și fiecare este egal cu sau .
Acum parcurgem toate de la jos la și construim o soluție aproximativă ca suma tuturor pentru care găsim o valoare. Pentru a
determina dacă sau este egal cu , luăm . Dacă (adică pătratul aproximării noastre inclusiv nu depășește pătratul inițial), atunci setăm , în caz contrar setăm și .
Pentru a evita pătratul la fiecare pas, stocăm diferența și o actualizăm la fiecare iterație setând c .
Inițial am stabilit pentru cel mai mare cu .
Ca o optimizare suplimentară, stocăm și , doi termeni în cazul în care nu sunt zero, în variabile separate , :
și poate fi actualizat eficient la fiecare pas:
observa asta
, care este rezultatul final returnat de funcția de mai jos.Implementarea algoritmului în limbaj C [10] :
int32_t isqrt(int32_tn) { assert((„valoarea de intrare trebuie să fie nenegativă”, n > 0)); int32_t x = n; // int32_t c = 0; // // începe cu cea mai mare putere de patru <= n int32_t d = 1 << 30; // Setați al doilea bit cel mai semnificativ la 1. // La fel ca ((nesemnat)INT32_MAX + 1) / 2. în timp ce (d > n) d >>= 2; în timp ce (d != 0) // pentru { dacă (x >= c + d) // dacă , atunci { x -= c + d; // c = (c >> 1) + d; // } altfel c >>= 1; // d >>= 2; // } întoarcere c; // }Este posibil să se implementeze un algoritm mai rapid atât în notație binară, cât și în zecimală dacă sunt folosite tabele pentru selecție, adică implementarea principiului utilizării mai multor memorie reduce timpul de execuție [11] .
Calculatoarele de buzunar implementează de obicei programe bune de logaritm exponențial și natural . Calculul rădăcinii pătrate S se face apoi folosind proprietățile logaritmilor ( ) și exponențialelor ( ):
Numitorul fracției corespunde rădăcinii a n- a. În cazul nostru, numitorul este 2. Aceeași identitate este folosită pentru a calcula rădăcina pătrată folosind tabele de logaritmi sau reguli de calcul .
Această metodă este aplicabilă pentru găsirea rădăcinii pătrate a și converge cel mai bine pentru . Aceasta, totuși, nu este o limitare semnificativă pentru calcularea pe computere, deoarece în reprezentările în virgulă mobilă și în virgulă fixă ale numerelor binare este trivial să se înmulțească cu o putere întreagă de 4 și apoi să se corecteze la puterea dorită de 2 prin schimbarea exponentul sau, respectiv, deplasarea. Astfel, poate fi mutat în . Mai mult, metoda de mai jos nu folosește împărțiri generale, ci doar adunarea, scăderea, înmulțirea și împărțirea cu o putere de doi. Ultima dintre aceste acțiuni este implementată trivial. Dezavantajul metodei este acumularea de erori, spre deosebire de metodele iterative cu o variabilă, cum ar fi Babilonian.
Etapa inițială a metodei
Pași iterativi
Apoi (pentru ).
Rețineți că convergența și, prin urmare , este pătratică.
Dovada metodei este destul de simplă. Mai întâi rescriem definiția iterativă ca
.Acum, din față, se dovedește că
și deci convergența către rezultatul dorit este asigurată de convergența către 0, care, la rândul său, decurge din .
Această metodă a fost dezvoltată în jurul anului 1950 de M. W. Wilks , D. J. Wheeler și S. Gill [12] pentru a fi utilizată în EDSAC , unul dintre primele calculatoare electronice [13] . Ulterior, metoda a fost generalizată la rădăcini nepătrate [14] .
Următoarele sunt metode iterative pentru calcularea reciprocei rădăcinii pătrate a lui S , adică . Dacă se găsește o astfel de valoare, o găsim pur și simplu înmulțind: . Aceste iterații folosesc doar înmulțirea și nu folosesc împărțiri. Pentru că metodele sunt mai rapide decât metoda babiloniană . Cu toate acestea, metodele sunt instabile, dacă valoarea inițială nu este aproape de inversul valorii rădăcinii, iterațiile diverge. Prin urmare, poate fi avantajos să repetați mai întâi metoda babiloniană pentru o estimare aproximativă a rădăcinii înainte de a începe să utilizați aceste metode.
Unele computere folosesc algoritmul Goldschmidt pentru a calcula și simultan . Algoritmul Goldschmidt găsește mai repede decât iterația Newton-Rapson pe computere cu operații de multiplicare-adunare partajate și fie un procesor în virgulă mobilă pipeline, fie două procesoare independente în virgulă mobilă [15] .
Prima modalitate de a scrie algoritmul Goldschmidt începe cu
(de obicei este folosită căutarea în tabel)iar iterațiile sunt efectuate
până când este suficient de aproape de 1 sau au fost efectuate un număr fix de iterații. Iterațiile converg către
, .Rețineți că puteți omite calculul sau , iar dacă ambele sunt dorite, le puteți utiliza la sfârșit în loc să evaluați la fiecare iterație.
A doua metodă, folosind operațiile combinate de înmulțire-adunare , începe cu
(de obicei este folosită căutarea în tabel)iar iterațiile sunt efectuate
până când se apropie suficient de 0 sau se efectuează un număr fix de iterații. Valorile converg spre
.Dacă N este o aproximare a , cea mai bună aproximare poate fi găsită folosind seria Taylor a funcției rădăcinii pătrate :
Ordinea de convergență este egală cu numărul de termeni utilizați în serie. Când folosiți doi termeni, metoda este echivalentă cu metoda babiloniană . Când se utilizează trei termeni, fiecare iterație folosește aproape la fel de multe operații cât folosește aproximarea Bakhshali , dar convergența este mai slabă. Prin urmare, această metodă nu este o metodă de calcul deosebit de eficientă. Pentru a maximiza rata de convergență, N ar trebui să fie ales să fie cât mai mic posibil.
Iraționalitățile pătratice (numerele de forma , unde a , b și c sunt numere întregi), și în special rădăcinile pătrate ale numerelor întregi, au fracții continuate periodice . Uneori, scopul nu este de a găsi valoarea numerică a rădăcinii pătrate, ci de a o extinde într-o fracție continuă și, prin urmare, aproximarea sa rațională. Fie S un număr pozitiv a cărui rădăcină trebuie găsită. Acum fie a aproximația inițială și r restul, atunci putem scrie Deoarece avem , putem exprima rădăcina pătrată a lui S ca
Aplicând această expresie pentru la numitorul fracției, obținem
notație compactăNumărătorul/numitorul expansiunii continue a fracției (vezi stânga) este greu de notat și, de asemenea, dificil de încadrat în sistemul de formatare a documentelor existent. Din acest motiv, a fost dezvoltată o notație specială pentru a reprezenta în mod compact părțile întregi și periodice ale fracțiilor continue. O astfel de convenție folosește „linia întreruptă” lexicală pentru a reprezenta bara dintre numărător și numitor, ceea ce permite fracției să fie scrisă orizontal în loc de vertical:
Aici, fiecare cursă orizontală (în fracțiune) este reprezentată de trei linii - două verticale și una orizontală, care se despart de .
O notație și mai compactă are o formă specială
Pentru fracțiile periodice continuate (care sunt toate rădăcini pătrate), partea care se repetă este listată o singură dată, cu o bară peste partea care se repetă:
Pentru √ 2 valoarea este 1, deci reprezentarea va fi
Urmând această cale, obținem fracția continuă generalizată pentru rădăcina pătrată
Primul pas în calcularea unei astfel de fracțiuni pentru a obține o rădăcină pătrată este înlocuirea rădăcinii și alegerea numărului de numitori. De exemplu, în formă canonică este 1 și pentru √ 2 , este 1, deci fracția continuă numerică pentru 3 numitori este
Pasul 2. Fracția continuă este rulată, câte un numitor, pentru a obține o fracție rațională al cărei numărător și numitor sunt numere întregi. Procesul de pliere arată astfel (luând primii trei numitori):
În cele din urmă (pasul 3), împărțim numărătorul la numitorul fracției raționale pentru a obține o aproximare a rădăcinii:
rotunjite la trei zecimale.Valoarea reală a rădăcinii √ 2 este 1,41 până la trei cifre semnificative. Eroarea relativă este de 0,17%, deci o fracție rațională este bună până la aproape trei zecimale. Dacă luăm mai mulți numitori, obținem o îmbunătățire consistentă a aproximării - patru numitori dau o fracție , ceea ce oferă aproape 4 cifre de precizie etc.
Fracțiile continuate sunt disponibile în tabele pentru cel puțin numere mici și constante bine-cunoscute. Pentru numerele arbitrare în notație zecimală, valorile precalculate sunt cel mai probabil inutile. Următorul tabel de fracții raționale mici, numite convergente , este derivat din fracții continue canonice pentru mai multe constante:
√S _ | a continuat împuşcat | ~zecimală | Fracții adecvate |
---|---|---|---|
√2 _ | 1,41421 | ||
√ 3 | 1,73205 | ||
√5 _ | 2,23607 | ||
√ 6 | 2,44949 | ||
√ 10 | 3,16228 | ||
1,77245 | |||
1,64872 | |||
1,27202 |
Notă: Toate fracțiile aplicabile sunt enumerate până la numitorul 99.
În general, cu cât numitorul unei fracții raționale este mai mare, cu atât aproximarea este mai bună. Se poate demonstra, de asemenea, că tăierea unei fracții continuă are ca rezultat o fracție rațională, cu o mai bună aproximare a rădăcinii oricărei fracții cu un numitor mai mic sau egal cu numitorul acelei fracții. De exemplu, nicio fracție cu un numitor mai mic de 70 nu este la fel de bună ca 99/70 aproximând √2 .
Secvența Lucas de primul fel este definită de relația recursivă
iar polinomul său caracteristic este
, are un discriminant și rădăcini
Toate acestea dau următoarea valoare pozitivă
. Deci, dacă vrem să obținem , putem alege și și apoi calcula folosind și pentru valori mari . Cel mai eficient mod de a calcula și −
Rezultat:
si apoi la :
Numărul este reprezentat ca un număr în virgulă mobilă ca . Acest format de notație este numit și notație exponențială . Rădăcina pătrată a acestui număr este egală și formule similare pot fi prezentate pentru rădăcini cubice și logaritmi. Acest lucru nu simplifică sarcina, dar dacă este necesară doar o aproximare, atunci este o estimare bună a ordinii mantisei. În plus, înțelegem că unele puteri ale lui p se pot dovedi impare, apoi în loc să lucrăm cu puteri fracționale ale bazei, înmulțim cu ea și scădem una din grad, făcându-l par. Reprezentarea rafinată este convertită în , deci rădăcina pătrată va fi .
Dacă este luată numai partea întreagă a mantisei, aceasta poate lua valori de la 1 la 99 și aceasta poate fi folosită ca index într-un tabel cu 99 de rădăcini precalculate pentru a finaliza estimarea. Un computer care utilizează o bază hexazecimală poate necesita un tabel mai mare, dar folosind baza 2, tabelul va consta doar din trei valori - biții posibili ai părții întregi a reprezentării rafinate a mantisei pot fi 01 (dacă exponentul este par, deci nu există nicio schimbare și rețineți că numărul normalizat în virgulă mobilă are întotdeauna o cifră mare diferită de zero), sau dacă exponentul a fost impar, 10 sau 11, aceștia sunt primii doi biți ai mantisei originale. Apoi 6,25 (= 110,01 în binar) se normalizează la o putere pară, deci perechea de biți mantise este 01, în timp ce 0,625 (= 0,101 în binar) se normalizează la o putere impară, deci este necesară o conversie a numărului la , iar apoi perechea de biți va fi 10. Rețineți că bitul cel mai puțin semnificativ al ordinului este reflectat în bitul cel mai semnificativ al mantisei grupate în perechi. Un exponent par are cel mai puțin semnificativ bit de zero și mantisa quad va începe la zero, în timp ce un exponent impar va avea un 1 în bitul cel mai puțin semnificativ și mantisa quad va începe la 1. Deci, atunci când exponentul este înjumătățit, este echivalent cu deplasarea celui mai puțin semnificativ bit al exponentului la primul bit al mantisei grupate în perechi.
Un tabel cu trei elemente poate fi extins pentru a include biți de mantisă suplimentari. Cu toate acestea, în cazul calculatoarelor, în loc să se calculeze interpolarea într-un tabel, este adesea mai bine să se caute o modalitate mai simplă de calcul care să dea aceleași rezultate. Totul depinde acum de detaliile exacte ale formatului de reprezentare a numerelor și de operațiunile care sunt disponibile pentru a obține părți din număr și a lucra cu ele. De exemplu, Fortran conține o funcție EXPONENT(x)pentru obținerea unei diplome. Efortul depus pentru a obține o aproximare inițială bună se plătește prin eliminarea iterațiilor suplimentare ale procesului de rafinare care ar fi necesare în cazul unei aproximări proaste.
Multe computere urmează standardul IEEE în virgulă mobilă (sau o reprezentare destul de apropiată) și o aproximare foarte rapidă a rădăcinii pătrate poate fi obținută ca punct de plecare pentru metoda lui Newton. Tehnica pentru această aproximare provine din faptul că formatul numărului flotant (baza doi) aproximează logaritmul de bază 2. Adică
Deci, pentru un număr în virgulă mobilă IEEE pe 32 de biți (în care exponentul are un offset de 127 [16] ), puteți obține un logaritm aproximativ interpretând numărul ca un întreg de 32 de biți, înmulțindu-l cu și scăzând offset-ul 127, adică
De exemplu, numărul 1,0 în hexazecimal este 0x3F800000, care poate fi reprezentat ca atunci când este văzut ca un întreg. Folosind formula de mai sus, veți obține așa cum vă așteptați de la . În mod similar, veți obține 0,5 din 1,5 (=0x3FC00000).
Pentru a obține rădăcina pătrată, împărțiți logaritmul la 2 și convertiți rezultatul înapoi. Programul de mai jos demonstrează ideea. Rețineți că bitul cel mai puțin semnificativ al exponentului este tradus în mod deliberat în mantise. O modalitate de a justifica pașii acestui program, presupunând că acesta este decalajul gradului și este numărul de biți stocați în mantise, este de a demonstra
/* Presupunem că numărul flotant este în format IEEE 754 */ #include <stdint.h> float sqrt_approx ( float z ) { unire { float f ; uint32_t i ; } val = { z }; /* Convertiți tipul fără a schimba reprezentarea biților */ /* * Demonstrați că * ((((val.i / 2^m) - b) / 2) + b) * 2^m = ((val.i - 2^m) / 2) + ((b + 1) / 2) * 2^m) * unde * b = offset de putere * m = numărul de biți în mantise */ val . i -= 1 << 23 ; /* Scăderea 2^m. */ val . i >>= 1 ; /* Împărțiți la 2. */ val . i += 1 << 29 ; /* Adăugați ((b + 1) / 2) * 2^m. */ return val . f ; /* Interpretați din nou ca float */ }Cele trei operații aritmetice care formează miezul funcției pot fi reprezentate într-o singură linie. Se poate adăuga o rafinare suplimentară pentru a reduce eroarea relativă maximă. Astfel, cele trei operații, fără a include reducerea la real, pot fi rescrise ca
val . i = ( 1 << 29 ) + ( val . i >> 1 ) - ( 1 << 22 ) + a ;unde a este un offset pentru a reduce erorile de aproximare. De exemplu, cu a = 0 rezultatele sunt exacte pentru puterile pare ale lui 2 (ex. 1,0), dar pentru alte numere rezultatul va fi oarecum mare (ex. 1,5 pentru 2,0 în loc de 1,414... cu o eroare de 6%). Pentru a = −0x4B0D2, eroarea relativă maximă este redusă la ±3,5%.
Dacă aproximarea trebuie utilizată ca valoare inițială pentru metoda lui Newton în ecuație , atunci este de preferat forma inversă prezentată în secțiunea următoare.
O variantă a procedurii de mai sus este prezentată mai jos și poate fi utilizată pentru a calcula inversul rădăcinii pătrate, adică . Această variantă a fost scrisă de Greg Walsh. Aproximația deplasării dă o eroare relativă mai mică de 4% și eroarea este redusă la 0,15% după o iterație a metodei lui Newton [17] . În grafica computerizată, aceasta este o modalitate foarte eficientă de a normaliza un vector.
float invSqrt ( float x ) { float xhalf = 0,5f * x ; unire { float x ; int i ; } u ; tu . x = x ; tu . i = 0x5f375a86 - ( u . i >> 1 ); /* Următoarea linie poate fi repetată de un număr arbitrar de ori pentru a crește precizia */ tu . x = u . x * ( 1,5f - xjumătate * u . x * u . x ); întoarce- te . x ; }Unele VLSI implementează găsirea reciprocei rădăcinii pătrate folosind o estimare polinomială urmată de iterația Goldschmidt [18] .
Dacă , atunci rădăcina sa principală este egală cu
Dacă , unde a și b sunt numere reale și , atunci rădăcina sa principală este egală cu
Acest lucru poate fi verificat prin pătrat [19] [20] . Aici
este modulul numărului S . Rădăcina principală a unui număr complex este definită ca o rădăcină cu o parte reală nenegativă.