Kvadratrotsmetoder är beräkningsalgoritmer för att beräkna de ungefärliga värdena för de huvudsakliga (eller icke-negativa) kvadratrötterna (vanligtvis betecknade som , eller ) av ett reellt tal. Aritmetiskt betyder detta att om ett tal ges , hittar proceduren ett tal som, när det multipliceras med sig självt, ger . Algebraiskt betyder detta proceduren för att hitta en icke-negativ rot av en ekvation . Geometriskt innebär det att man konstruerar en sida av en kvadrat med en given area.
Vilket reellt tal som helst har två rötter [1] . Huvudvärdet av kvadratroten ur de flesta siffror är ett irrationellt tal med en oändlig följd av decimalsiffror. Som ett resultat kan decimalrepresentationen av en sådan kvadratrot endast beräknas ungefär med ändlig precision (decimaler). Men även om vi tar kvadratroten ur ett heltal, så att resultatet har en ändlig representation, kan vissa av procedurerna som används för att beräkna roten bara returnera en serie approximationer med ökande precision.
Den fortsatta bråkrepresentationen av ett reellt tal kan användas istället för decimal eller binär expansion och denna representation har egenskapen att kvadratroten av vilket rationellt tal som helst (som inte är en perfekt kvadrat) har en period, dvs en periodisk expansion som liknar hur rationella tal har upprepad expansion av decimaltalssystemet.
De vanligast accepterade analysmetoderna är iterativa och består av två steg: att hitta ett lämpligt startvärde och sedan iterativt förfina tills ett visst stoppkriterium uppnås. Startvärdet kan vara vilket tal som helst, men om det är närmare slutvärdet kommer färre iterationer att krävas. Den mest kända metoden, och ännu bekvämare för programmering, är Newtons metod, som är baserad på beräkningen av derivatan. Flera metoder, som manuell Horner-delning eller serieexpansion, kräver inget initialvärde. I vissa applikationer krävs det att hitta heltalskvadratroten , vilket är kvadratroten avrundad till närmaste heltal (i det här fallet kan en modifierad procedur användas).
Vilken metod som används beror på hur resultatet kommer att användas (det vill säga hur exakt resultatet måste vara) och vilka verktyg som finns tillgängliga. Metoder kan grovt delas upp i de som kan göras mentalt, som kräver en penna och papper, eller de som är implementerade som ett program och körs på datorer eller andra datorenheter. Konvergenshastigheten (hur många iterationer kommer att krävas för att uppnå en given noggrannhet), beräkningskomplexiteten för individuella operationer (som division) eller iterationer, och fördelningen av fel (noggrannheten hos resultatet) kan tas med i beräkningen.
Förfaranden för att hitta kvadratrötter (särskilt roten av 2) har varit kända åtminstone sedan det antika Babylons tid (1600-talet f.Kr.). Herons metod från 1:a århundradets Egypten var den första verifierbara algoritmen för att beräkna kvadratroten. Moderna analytiska metoder började utvecklas efter antagandet av arabiska siffror i Västeuropa under den tidiga renässansen . Nuförtiden har nästan alla datorenheter en snabb och exakt kvadratrotsfunktion som en inbyggd programmeringsspråkskonstruktion, biblioteksfunktion eller hårdvarusats som är baserad på procedurerna som beskrivs nedan.
Många iterativa kvadratrotsalgoritmer kräver ett initialt slumpmässigt värde. Detta värde måste vara ett positivt tal som inte är noll. Det måste vara mellan 1 och , talet vars kvadratrot vi letar efter, eftersom kvadratroten måste ligga inom dessa gränser. Om det initiala värdet är mycket långt från roten kommer algoritmen att behöva fler iterationer. Om du börjar med (eller med ), kommer det att fungera om extra iterationer bara för att få ordningen på roten. Därför är det användbart att ha en grov uppskattning av roten, som kan ha dålig noggrannhet, men är lätt att beräkna. I allmänhet gäller att ju mer exakt uppskattningen är, desto snabbare blir konvergensen. För Newtons metod (även kallad Babylonisk eller Herons metod) ger ett initialvärde något större än roten snabbare konvergens än ett initialvärde mindre än roten.
Generellt sett betraktas uppskattningen på ett godtyckligt intervall där det är känt att det innehåller en rot (som ). Att få en bättre uppskattning innebär antingen att få smalare gränser för intervallet eller en bättre funktionell approximation till . Det senare innebär vanligtvis att man använder högre ordningspolynom för approximationen, även om inte alla approximationer använder polynom. Vanliga skattningsmetoder är skalära, linjära, hyperboliska och logaritmiska. Decimalsystemet används vanligtvis för att uppskatta mentalt eller på papper. Det binära talsystemet är mer lämpat för datorutvärderingar. Vid utvärdering behandlas vanligtvis exponenten och mantissan separat.
Vanligtvis uttrycks talet i exponentiell form som , där , och n är ett heltal, då kan en uppskattning av den möjliga kvadratroten vara , där .
Skalära uppskattningarSkalära metoder delar upp hela intervallet i fack och poängen i varje fack representeras av ett enda nummer. Om intervallet behandlas som ett enda intervall är det aritmetiska medelvärdet (5,5) eller det geometriska medelvärdet () acceptabla uppskattningar. De absoluta och relativa uppskattningarna för dessa uppskattningar kommer att skilja sig åt. I allmänhet kommer ett enda tal att vara mycket felaktigt. Mer exakta uppskattningar delar upp intervallet i två och fler intervall, men den skalära uppskattningen fortsätter att vara mycket grov.
För två geometriskt uppdelade intervall kan kvadratroten uppskattas till [2] .
Denna uppskattning har ett maximalt absolut fel vid punkt = 100 och ett maximalt relativt fel på 100 % vid punkt = 1.
Till exempel, för med en sönderdelning , blir poängen . , med ett absolut fel på 246 och ett relativt fel på nästan 70 %.
Linjär uppskattningDen bästa uppskattningen och standardmetoden är den linjära approximationen av funktionen på en liten båge. Om exponenten, som ovan, extraheras från talet och intervallet reduceras till , kan du använda en sekant eller tangent någonstans längs bågen för att approximera, men den direkta minsta kvadraters regression blir mer exakt.
Den räta linjen, som erhålls med minsta kvadratmetoden, minimerar det genomsnittliga avståndet mellan skattningen och funktionens värde. Hennes ekvation är . Efter att ha transformerat och avrundat koefficienterna för att förenkla beräkningar får vi
Detta är den bästa medeluppskattningen som kan erhållas genom ett försök till en linjär approximation av funktionen i intervallet . Uppskattningen har ett maximalt absolut fel på 1,2 vid punkten a=100 och ett maximalt relativfel på 30 % vid punkterna S=1 och 10 [3] .
För att dividera med 10, subtrahera en från exponenten , eller, bildligt talat, flytta decimaltecknet en position åt vänster. För denna formel ger varje adderad konstant lika med 1 plus ett litet steg en tillfredsställande uppskattning, så det finns inget behov av att memorera det exakta talet. Approximation (avrundad eller inte avrundad) med en rät linje som subtraherar regionen vad gäller noggrannhet ger inte mer än ett korrekt tecken. Det relativa felet är mer än 1/2 2 , så det ger mindre än 2 bitar av information. Noggrannheten är kraftigt begränsad, eftersom regionen sträcker sig över två storleksordningar, vilket är ganska stort för denna typ av uppskattning.
En betydligt bättre uppskattning kan erhållas genom att använda en bitvis linjär approximation, det vill säga att använda flera segment som approximerar den ursprungliga bågens subbåge. Ju fler segment som används, desto bättre approximation. Den vanligaste användningen av tangenter. Den kritiska punkten är hur man delar bågen och var man ska placera beröringspunkterna. En effektiv metod för att dividera bågen från y=1 till y=100 är geometrisk - för två intervall är intervallgränsen kvadratroten av det ursprungliga intervallet, 1 * 100, det vill säga och . Under tre intervaller kommer det att finnas kubrötter - , och , och så vidare. För två intervaller är detta ett mycket bekvämt nummer. Det är lätt att få tangentlinjer vid kontaktpunkterna och . Deras ekvationer är: och . Om vi vänder på ekvationerna får vi att kvadratrötterna är lika med och . Sedan för :
De maximala absoluta värdena ligger i de högra gränserna för intervallen, vid punkterna a=10 och 100, och är lika med 0,54 respektive 1,7. De maximala relativa felen visas i slutet av intervallen, vid punkterna a=1, 10 och 100, och är lika med 17 %. 17 % eller 0,17. De är större än 1/10, så metoden ger en noggrannhet på mindre än en signifikant siffra.
Hyperbolisk uppskattningI vissa fall kan den hyperboliska skattningen vara giltig, eftersom hyperbeln också är en konvex kurva och kan ligga längs bågen Y = x 2 bättre än en rät linje. Den hyperboliska skattaren är beräkningsmässigt svårare eftersom den kräver division med ett flyttal. En nästan optimal hyperbolisk approximation till x 2 på intervallet är . Efter transformation får vi . Sedan för :
Flyttalsindelningen måste vara exakt med en decimal, eftersom all utvärdering ger den precisionen, och en sådan division kan göras mentalt. Den hyperboliska skattningen är i genomsnitt bättre än den skalära eller linjära skattningen. Dess maximala absoluta fel är 1,58 vid punkt 100, och dess maximala relativa fel är 16,0 % vid punkt 10. I värsta fall är a=10 poängen 3,67. Om vi börjar vid 10 och applicerar Newton-Rapson iterationerna direkt, tar det två iterationer, som ger 3,66, innan vi når noggrannheten för den hyperboliska uppskattningen. För ett mer typiskt fall som 75 är den hyperboliska uppskattningen 8,00 och det krävs 5 Newton-Rapson-iterationer som börjar vid 75 för att få ett mer exakt resultat.
Aritmetisk utvärderingEn metod som liknar bitvis linjär approximation, men som bara använder aritmetiska operationer istället för algebraiska ekvationer, använder multiplikationstabellen omvänt - kvadratroten av tal mellan 1 och 100 är någonstans mellan 1 och 10, så eftersom vi vet att 25 är exakt kvadrat (5 × 5) och 36 är en exakt kvadrat (6 × 6), då börjar kvadratroten av ett tal som är större än 25 men mindre än 36 med talet 5. På samma sätt för tal mellan andra kvadrater. Denna metod ger den korrekta första siffran, men dess noggrannhet är bara en siffra - den första siffran i kvadratroten av 35 är till exempel 5, men själva roten av 35 är nästan lika med 6.
Det är bättre att dela intervallet mellan två rutor på mitten. Så roten av ett tal mellan 25 och halvvägs upp till 36 (vilket är 30,5) utvärderas till 5, andra tal större än 30,5 upp till 36 utvärderas till 6 [4] . Proceduren kräver mycket lite aritmetik för att hitta mitten av två produkter från tabellen. Här är en tabell över sådana siffror:
a | närmaste torg | est. |
---|---|---|
1 till 2,5 | 1 (= 1 2 ) | ett |
2,5 till 6,5 | 4 (= 2 2 ) | 2 |
6,5 till 12,5 | 9 (= 3 2 ) | 3 |
12,5 till 20,5 | 16 (= 4 2 ) | fyra |
20,5 till 30,5 | 25 (= 5 2 ) | 5 |
30,5 till 42,5 | 36 (= 6 2 ) | 6 |
42,5 till 56,5 | 49 (= 72 ) | 7 |
56,5 till 72,5 | 64 (= 82 ) | åtta |
72,5 till 90,5 | 81 (= 9 2 ) | 9 |
90,5 till 100 | 100 (= 102 ) | tio |
Den sista operationen kommer att vara multiplikationen av poängen k med styrkan av tiotalet delat på hälften, så att för ,
Metoden ger en betydande sifferprecision eftersom den avrundar till bästa första siffra.
Metoden kan utökas till 3 signifikanta siffror i de flesta fall genom att interpolera mellan närmaste kvadrater. Om , då är ungefär lika med k plus en bråkdel lika med skillnaden mellan a och , dividerat med skillnaden mellan de två kvadraterna:
varDen sista operationen, som ovan, är multiplikationen av resultatet med tiopotens delat på hälften
Talet k är decimalsiffran och R är bråket som ska omvandlas till decimalen. Ett bråk har vanligtvis en siffra i täljaren och en eller två siffror i nämnaren, så konvertering till en decimal kan göras mentalt.
Exempel: hitta kvadratroten ur 75. , så a är 75 och n är 0. Baserat på multiplikationstabellen ska kvadratroten ur mantissan vara 8 med en bråkdel eftersom , a , är för stor. Så k är 8 där bråkdelen är decimalrepresentationen av R . Bråket R har både en täljare och en nämnare. 11/17 är något mindre än 12/18, vilket är 2/3 eller 0,67, så 0,66 är en bra gissning (det är okej att göra en gissning här eftersom felet är litet). Så rotens värde är . √ 75 till tre signifikanta siffror skulle vara 8,66, så en poäng till tre signifikanta siffror är bra. Alla uppskattningar som använder denna metod är inte så exakta, men de är ganska nära.
När arbetet utförs i det binära systemet (säg i en datorprocessor) uttrycks det som , där , kvadratroten kan uppskattas som
vilket är en minsta kvadraters regression över de 3 mest signifikanta bitarna. har ett maximalt absolut fel på 0,0408 vid punkt =2 och ett maximalt relativfel på 3,0 % vid punkt =1. För beräkningar är en avrundad uppskattning lämplig (eftersom koefficienterna är 2 potenser)
[5]som har ett maximalt absolut fel på 0,086 vid punkt 2 och ett maximalt relativfel på 6,1 % vid poäng och .
För den binära approximationen ger Since ger uppskattningen ett absolut fel på 19 och ett relativt fel på 5,3%. Det relativa felet är något mindre än 1/2 4 , så approximationen är korrekt till 4+ bitar.
En uppskattning för upp till 8 bitar kan erhållas genom att slå upp tabellen för de mest signifikanta 8 bitarna , givet att den mest signifikanta biten är implicit i de flesta flyttalsrepresentationer, och de minst signifikanta bitarna efter 8 bitar måste avrundas. Tabellen innehåller 256 byte av förberäknade 8-bitars kvadratrötter. Till exempel, för index 11101101 2 , som är 1,8515625 10 i decimal , är värdet i tabellen 10101110 2 , vilket är 1,359375 10 i decimal , kvadratroten ur 1,8515685 bitars tecken (+ decimala tecken 10 till 10) .
Den kanske första algoritmen som används för approximation är den metod som är känd som den babyloniska metoden , även om det inte finns några direkta bevis, annat än hypotetiska slutsatser, för att babyloniska matematiker använde denna metod [6] . Metoden är också känd som Herons metod , efter den grekiske matematikern från det första århundradet Heron , som gav den första explicita beskrivningen av metoden i sitt 60-åriga verk Metrica [7] . Grundtekniken är att om x är större än kvadraten roten av ett icke-negativt reellt tal S , då blir det mindre rot och vice versa. Så det är rimligt att förvänta sig att medelvärdet av dessa två tal är närmare roten (det formella beviset för detta faktum är baserat på olikheten om det aritmetiska, geometriska och harmoniska medelvärdet , vilket visar att detta medelvärde alltid är större än kvadraten root, vilket säkerställer konvergens). Metoden motsvarar att använda Newtons metod för att lösa ekvationen .
Mer exakt, om x är en initial gissning för , och felet i vår uppskattning är sådant att , kan vi utöka parenteserna och få
eftersom .Därför kan vi kompensera för felet och uppdatera vår gamla uppskattning
Eftersom det beräknade felet inte var exakt kommer det att bli vår nästa uppskattning. Uppdateringsprocessen fortsätter tills vi når önskad noggrannhet. Det är en algoritm med kvadratisk konvergens , vilket innebär att antalet korrekta siffror i approximationen (i grova drag) fördubblas med varje iteration. Det fungerar så här:
Algoritmen kan representeras enligt följande:
Algoritmen fungerar också bra för p -adiska tal , men kan inte användas för att identifiera riktiga kvadratrötter med p -adiska kvadratrötter. Man kan till exempel konstruera en sekvens av rationella tal erhållna med denna metod som konvergerar till +3 i fallet med reella tal, men till -3 i 2-adiska tal.
För att beräkna √ S , där S = 125348, till sex signifikanta siffror, använd den grova uppskattningsmetoden som beskrivs ovan
Därför .
Antag att x 0 > 0 och S > 0. Sedan för alla n x n > 0. Det relativa felet x n definieras som
och då
Nu kan man visa det
och följaktligen
och detta innebär garanterad konvergens, och denna konvergens är kvadratisk .
Konvergens i värsta fallOm vi använder en grov uppskattningsmetod med den babyloniska metoden, så är de värsta fallen av noggrannhet i fallande ordning:
Och då i alla fall
Avrundningsfel försvagar konvergensen. Det rekommenderas att lagra minst en extra siffra ovanför önskad precision x n för att minimera avrundningsfel.
Denna metod för att hitta kvadratrotens approximation skrevs i ett gammalt indisk manuskript som kallas Bakhshali-manuskriptet . Metoden motsvarar två iterationer av den babyloniska metoden med initialt värde x 0 . Algoritmen är alltså kvadratiskt konvergent, vilket innebär att antalet giltiga tecken för approximationen ökar med ungefär fyra gånger med varje iteration [8] . Representationen av algoritmen i modern notation är som följer: Beräkna , låt x 0 2 vara den initiala approximationen till roten S . Iterationer utförs sekventiellt
Detta kan användas för att bygga en rationell approximation till kvadratroten, som börjar med ett heltal. Om är ett heltal valt nära S och är skillnaden vars absoluta värde minimeras, kan den första iterationen skrivas på följande sätt:
Bakhshalis metod kan generaliseras för att beräkna en godtycklig rot, inklusive bråkrötter [9] .
Låt oss använda samma exempel som gavs för den babyloniska metoden. Låt Då ger den första iterationen
På samma sätt ger den andra iterationen
Detta är en metod för att sekventiellt hitta varje siffra i kvadratroten. Metoden är långsammare än babylonisk, men har vissa fördelar
Napiers stickor inkluderar ytterligare faciliteter för att utföra denna algoritm. Algoritmen för att beräkna den n:te rotsiffran för siffran är en generalisering av denna metod.
Tänk först på fallet att hitta kvadratroten ur ett tal Z , som är kvadraten av ett tvåsiffrigt tal XY , där X är tiotalssiffran och Y är etttalssiffran. Vi har:
Låt oss först definiera värdet på X . X är den största siffran så att X 2 inte överstiger Z , från vilken de två sista siffrorna tas bort.
I nästa iteration kopplar vi ihop ett par siffror genom att multiplicera X med 2 och sätta resultatet i tiotalspositionen och sedan försöka ta reda på vad Y är lika med .
Eftersom svaret i vårt fall är den exakta kvadratroten, stannar algoritmen.
Samma idé kan utökas för att beräkna en godtycklig kvadratrot. Föreställ dig att vi kan hitta kvadratroten ur N som summan av n positiva tal så att
Genom att återanvända identiteten
den högra sidan kan representeras som
Detta uttryck låter oss hitta kvadratroten genom successivt urval av värden . Antag att siffrorna redan har valts, då ges den m:te termen av , där är den hittade approximationen till kvadratroten. Nu måste varje nytt urval tillfredsställa rekursionen
så för alla vid startvärdet Om den exakta kvadratroten hittas. Om inte, så ger summan en lämplig approximation till kvadratroten och blir ett approximationsfel.
Till exempel i decimal har vi
var är indikatorer för siffrornas position och koefficienterna . Vid varje m:te steg för att beräkna kvadratroten hittas en ungefärlig kvadratrot. Storleken och summeringstermerna ges av formlerna
Eftersom positionsindikatorerna har en jämn styrka på 10, behöver vi bara arbeta med paret med högsta siffror under den återstående termen vid något månstegssteg. Avsnittet nedan organiserar denna procedur.
Uppenbarligen kan en liknande metod användas för att beräkna kvadratroten i vilket talsystem som helst, inte nödvändigtvis i decimal. Att hitta kvadratroten siffra för siffra i binärt är till exempel ganska effektivt eftersom värdet slås upp i den lilla uppsättningen siffror {0,1}. Detta gör beräkningen snabbare, eftersom värdet vid varje steg antingen är lika med eller lika med . Det faktum att det bara finns två möjligheter för gör det också lättare att välja ett värde i beräkningens månaste steg. Detta beror på att vi bara behöver kontrollera att för Om detta villkor är uppfyllt tar vi ; och om inte, så tar vi också det faktum att multiplikation med 2 utförs genom att flytta till vänster hjälper till i beräkningarna.
Låt oss skriva det ursprungliga talet i decimalform. Tal skrivs på ett liknande sätt som divisionen med en lång divisionsalgoritm , och som i lång division kommer kvadratroten att skrivas på den översta raden. Låt oss nu dela upp siffrorna i par, börja med kommatecken, på båda sidor om det. Kvadratrotens decimalkomma kommer att vara på kvadratens decimalkomma. En kvadratrotssiffra skrivs över ett par kvadratrotssiffror.
Med utgångspunkt från läget längst till vänster utför vi följande procedur för varje siffror:
Hitta kvadratroten av 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 Algoritmstopp: Svar 12.34Det här avsnittet använder formalismen i avsnittet Beräkna siffra för siffra , med mindre ändringar, att , och var och en är lika med eller .
Nu går vi igenom allt från ner till och bygger en ungefärlig lösning som summan av alla som vi hittar ett värde för.
För att avgöra om eller är lika med , tar vi . Om (det vill säga kvadraten på vår approximation inklusive inte överstiger den ursprungliga kvadraten), då sätter vi , annars sätter vi och .
För att undvika kvadrering vid varje steg lagrar vi skillnaden och uppdaterar den vid varje iteration genom att ställa in c .
Till en början ställde vi in på den största med .
Som en ytterligare optimering lagrar vi och , två termer i fallet när de inte är noll, i separata variabler , :
och kan uppdateras effektivt vid varje steg:
Lägg märke till att
, vilket är slutresultatet som returneras av funktionen nedan.Implementering av algoritmen i C-språk [10] :
int32_t isqrt(int32_tn) { assert(("indatavärde måste vara icke-negativt", n > 0)); int32_t x = n; // int32_t c = 0; // // börjar med den högsta potensen av fyra <= n int32_t d = 1 << 30; // Sätt den näst mest signifikanta biten till 1. // Samma som ((osignerad)INT32_MAX + 1) / 2. medan (d > n) d >>= 2; while (d != 0) // för { if (x >= c + d) // if , then { x -= c + d; // c = (c >> 1) + d; // } annat c >>= 1; // d >>= 2; // } returnera c; // }Det är möjligt att implementera en snabbare algoritm i både binär och decimal notation om tabeller används för urval, det vill säga implementeringen av principen att använda mer minne minskar exekveringstiden [11] .
Fickräknare implementerar vanligtvis bra exponentiella och naturliga logaritmprogram . Beräkningen av kvadratroten S görs sedan med hjälp av egenskaperna hos logaritmer ( ) och exponentialer ( ):
Bråkens nämnare motsvarar den n :te roten. I vårt fall är nämnaren 2. Samma identitet används för att beräkna kvadratroten med hjälp av logaritmtabeller eller glidregler .
Denna metod är tillämpbar för att hitta kvadratroten av och konvergerar bäst för . Detta är dock inte en signifikant begränsning för beräkning på datorer, eftersom det i flyttals- och fixpunktsrepresentationer av binära tal är trivialt att multiplicera med en heltalspotens 4 och sedan korrigera till den önskade potensen 2 genom att ändra exponenten respektive skiftet. Således kan den flyttas inom . Dessutom använder metoden nedan inte allmänna divisioner, utan endast addition, subtraktion, multiplikation och division med två potens. Den sista av dessa åtgärder är trivialt genomförd. Nackdelen med metoden är felackumulering, till skillnad från iterativa metoder med en variabel som babyloniska.
Inledande steg i metoden
Iterativa steg
Sedan (för ).
Observera att konvergens , och därför , är kvadratisk.
Beviset för metoden är ganska enkelt. Vi skriver först om den iterativa definitionen som
.Nu, rakt på sak, är det bevisat att
och därför säkerställs konvergensen till det önskade resultatet av konvergensen till 0, som i sin tur följer av .
Denna metod utvecklades runt 1950 av M. W. Wilks , D. J. Wheeler och S. Gill [12] för användning i EDSAC , en av de första elektroniska datorerna [13] . Senare generaliserades metoden till icke-kvadratrötter [14] .
Följande är iterativa metoder för att beräkna den reciproka av kvadratroten av S , det vill säga . Om ett sådant värde hittas hittar vi det helt enkelt genom att multiplicera: . Dessa iterationer använder endast multiplikation och använder inte divisioner. Eftersom metoderna är snabbare än den babyloniska metoden . Metoderna är dock instabila, om det initiala värdet inte är nära rotvärdets reciproka divergerar iterationerna. Därför kan det vara fördelaktigt att först iterera med den babyloniska metoden för en grov uppskattning av roten innan man börjar använda dessa metoder.
Vissa datorer använder Goldschmidt-algoritmen för att beräkna och samtidigt . Goldschmidt-algoritmen hittar snabbare än Newton-Rapson-iterationen på datorer med delade multiplikations-add- operationer och antingen en flyttalsprocessor eller två oberoende flyttalsprocessorer [15] .
Det första sättet att skriva Goldschmidt-algoritmen börjar med
(vanligtvis används tabelluppslag)och iterationer utförs
tills det är tillräckligt nära 1 eller ett fast antal iterationer har utförts. Iterationerna konvergerar till
, .Observera att du kan utelämna beräkningen av eller och om båda önskas kan du använda den i slutet istället för att utvärdera vid varje iteration.
Den andra metoden, som använder de kombinerade multiplikations-additionsoperationerna , börjar med
(vanligtvis används tabelluppslag)och iterationer utförs
tills det kommer tillräckligt nära 0, eller ett fast antal iterationer utförs. Värdena konvergerar till
.Om N är en approximation till , kan den bästa approximationen hittas med hjälp av Taylor - serien av kvadratrotsfunktionen :
Konvergensordningen är lika med antalet termer som används i serien. När man använder två termer är metoden likvärdig med den babyloniska metoden . När du använder tre termer använder varje iteration nästan lika många operationer som Bakhshali-approximationen använder , men konvergensen är svagare. Därför är denna metod inte en särskilt effektiv beräkningsmetod. För att maximera konvergenshastigheten bör N väljas så att den är så liten som möjligt.
Kvadratiska irrationaliteter (tal i formen , där a , b och c är heltal), och i synnerhet kvadratrötter av heltal, har periodiska fortsatta bråk . Ibland är målet inte att hitta det numeriska värdet av kvadratroten, utan att expandera den till en fortsatt bråkdel , och därav dess rationella approximation. Låt S vara ett positivt tal vars rot ska hittas. Låt nu a vara den initiala approximationen och r vara resten, då kan vi skriva Eftersom vi har , kan vi uttrycka kvadratroten ur S som
Genom att tillämpa detta uttryck på bråkets nämnare får vi
kompakt notationTäljaren/nämnaren för den fortsatta bråkexpansionen (se vänster) är svår att skriva ner och även svår att passa in i det befintliga dokumentformateringssystemet. Av denna anledning har en speciell notation utvecklats för att kompakt representera heltal och periodiska delar av fortsatta bråk. En sådan konvention använder den lexikala "streckade linjen" för att representera stapeln mellan täljaren och nämnaren, vilket gör att bråket kan skrivas horisontellt istället för vertikalt:
Här representeras varje horisontellt streck (i bråkdel) av tre streck - två vertikala och ett horisontellt, som skiljer från .
En ännu mer kompakt notation har en speciell form
För periodiska fortsatta bråk (som alla är kvadratrötter) listas den repeterande delen endast en gång, med en stapel över den repeterande delen:
För √ 2 är värdet 1, så representationen blir det
Efter denna väg får vi den generaliserade fortsatta bråkdelen för kvadratroten
Det första steget i att beräkna ett sådant bråk för att få en kvadratrot är att ersätta roten och välja antalet nämnare. Till exempel, i kanonisk form är 1 och för √ 2 är 1, så det numeriskt fortsatta bråket för 3 nämnare är
Steg 2. Det fortsatta bråket rullas upp, en nämnare i taget, för att få ett rationellt bråk vars täljare och nämnare är heltal. Vikningsprocessen ser sedan ut så här (med de tre första nämnarna):
Slutligen (steg 3) delar vi täljaren med nämnaren för det rationella bråket för att få en approximation av roten:
avrundat till tre decimaler.Det verkliga värdet av roten √ 2 är 1,41 till tre signifikanta siffror. Det relativa felet är 0,17 %, så en rationell bråkdel är bra till nästan tre decimaler. Om vi tar fler nämnare får vi en konsekvent förbättring av approximationen - fyra nämnare ger en bråkdel , vilket ger nästan 4 siffrors noggrannhet osv.
Fortsatta bråk finns i tabeller för åtminstone små tal och välkända konstanter. För godtyckliga tal i decimalnotation är förberäknade värden troligen värdelösa. Följande tabell över små rationella fraktioner, kallade konvergenter , härleds från kanoniska fortsatta fraktioner för flera konstanter:
√S _ | fortsatte skottet | ~decimal | Lämpliga fraktioner |
---|---|---|---|
√2 _ | 1,41421 | ||
√ 3 | 1,73205 | ||
√5 _ | 2,23607 | ||
√ 6 | 2,44949 | ||
√ 10 | 3,16228 | ||
1,77245 | |||
1,64872 | |||
1,27202 |
Obs: Alla tillämpliga bråk listas upp till nämnaren 99.
I allmänhet gäller att ju större nämnaren för ett rationellt bråk är, desto bättre approximation. Det kan också visas att avskärning av ett fortsatt bråk resulterar i ett rationellt bråk, med en bättre approximation till roten av ett bråk med en nämnare mindre än eller lika med bråkets nämnare. Till exempel, ingen bråkdel med en nämnare mindre än 70 är lika bra som 99/70 som approximerar √2 .
Lucas-sekvensen av det första slaget definieras av den rekursiva relationen
och dess karakteristiska polynom är
, det har en diskriminerande och rötter
Allt detta ger följande positiva värde
. Så om vi vill få kan vi välja och och sedan beräkna med och för stora värden . Det mest effektiva sättet att beräkna och −
Resultat:
och sedan kl :
Talet representeras som ett flyttal som . Detta notationsformat kallas även exponentiell notation . Kvadratroten av detta tal är lika och liknande formler kan presenteras för kubrötter och logaritmer. Detta förenklar inte uppgiften, men om det bara krävs en uppskattning är det en bra uppskattning av mantissans ordning. Vidare förstår vi att vissa potenser av p kan visa sig vara udda, istället för att arbeta med bråkpotenser av basen multiplicerar vi med den och subtraherar en från graden, vilket gör den jämn. Den förfinade representationen konverteras till , så kvadratroten blir .
Om bara heltalsdelen av mantissan tas kan den ta värden från 1 till 99 och detta kan användas som ett index i en tabell med 99 förberäknade rötter för att slutföra uppskattningen. En dator som använder hexadecimal bas kan kräva en större tabell, men med bas 2 kommer tabellen bara att bestå av tre värden - de möjliga bitarna av heltalsdelen av den raffinerade representationen av mantissan kan vara 01 (om exponenten är jämn, så det finns ingen förskjutning, och observera att det normaliserade flyttaltalet alltid har en hög siffra som inte är noll), eller om exponenten var udda, 10 eller 11, är dessa de två första bitarna av den ursprungliga mantissan. Sedan normaliseras 6,25 (= 110,01 i binär) till en jämn potens, så mantissbitparet är 01, medan 0,625 (= 0,101 i binärt) normaliseras till en udda potens, så en talomvandling krävs till , och sedan bitparet kommer att vara 10. Observera att den minst signifikanta biten av ordningen återspeglas i den mest signifikanta biten av mantissan grupperad i par. En jämn exponent har den minst signifikanta biten noll och quad mantissan börjar på noll, medan en udda exponent kommer att ha en 1 i den minst signifikanta biten och quad mantissan börjar på 1. Så när exponenten halveras är det ekvivalent med att flytta den minst signifikanta biten av exponenten till den första biten av den parvis grupperade mantissan.
En tabell med tre element kan utökas med ytterligare mantissbitar. Men när det gäller datorer, istället för att beräkna interpolationen i en tabell, är det ofta bättre att leta efter ett enklare sätt att beräkna som ger samma resultat. Allt beror nu på de exakta detaljerna i nummerpresentationsformatet och på de operationer som är tillgängliga för att få delar av numret och arbeta med dem. Fortran innehåller till exempel en funktion EXPONENT(x)för att erhålla en examen. Ansträngningen som läggs ner på att få en bra initial approximation lönar sig genom att eliminera de ytterligare iterationer av förfiningsprocessen som skulle krävas i fallet med en dålig approximation.
Många datorer följer IEEE flyttalsstandard (eller en ganska nära representation) och en mycket snabb kvadratrotsapproximation kan erhållas som utgångspunkt för Newtons metod. Tekniken för denna approximation härrör från det faktum att det flytande talformatet (bas två) approximerar bas 2-logaritmen. Det vill säga,
Så för ett 32-bitars IEEE-flyttalstal (där exponenten har en offset på 127 [16] ), kan du få en ungefärlig logaritm genom att tolka talet som ett 32-bitars heltal, multiplicera det med och subtrahera förskjutningen 127, dvs
Till exempel är talet 1,0 i hexadecimal 0x3F800000, vilket kan representeras som när det ses som ett heltal. Med formeln ovan får du som förväntat från . På samma sätt får du 0,5 av 1,5 (=0x3FC00000).
För att få kvadratroten, dividera logaritmen med 2 och konvertera tillbaka resultatet. Programmet nedan visar idén. Observera att den minst signifikanta biten av exponenten medvetet översätts till mantissan. Ett sätt att motivera stegen i detta program, förutsatt att det är förskjutningen av graden, och är antalet lagrade bitar i mantissan, är att bevisa
/* Anta att flytande tal är i IEEE 754-format */ #inkludera <stdint.h> float sqrt_approx ( float z ) { union { flyta f ; uint32_t i ; } val = { z }; /* Konvertera typen utan att ändra bitrepresentationen */ /* * Bevisa att * ((((val.i / 2^m) - b) / 2) + b) * 2^m = ((val.i - 2^m) / 2) + ((b + 1) / 2) * 2^m) * där * b = effektförskjutning * m = antal bitar i mantissan */ val . i -= 1 << 23 ; /* Subtrahera 2^m. */ val . i >>= 1 ; /* Dividera med 2. */ val . i += 1 << 29 ; /* Lägg till ((b + 1) / 2) * 2^m. */ returvärde . _ f ; /* Tolka som float igen */ }De tre aritmetiska operationerna som utgör kärnan i funktionen kan representeras på en rad. En ytterligare förfining kan läggas till för att minska det maximala relativa felet. Således kan de tre operationerna, exklusive reduktionen till verklig, skrivas om som
val . i = ( 1 << 29 ) + ( val . i >> 1 ) - ( 1 << 22 ) + a ;där a är en offset för att minska approximationsfel. Till exempel, med a = 0 är resultaten exakta för jämna potenser av 2 (t.ex. 1,0), men för andra tal blir resultatet något stort (t.ex. 1,5 för 2,0 istället för 1,414... med ett 6% fel). För a = −0x4B0D2 reduceras det maximala relativa felet till ±3,5 %.
Om approximationen ska användas som utgångsvärde för Newtons metod i ekvationen , är den omvända formen som visas i nästa avsnitt att föredra.
En variant av ovanstående procedur presenteras nedan och kan användas för att beräkna inversen av kvadratroten, dvs. Denna variant skrevs av Greg Walsh. Skiftapproximationen ger ett relativt fel på mindre än 4 % och felet reduceras till 0,15 % efter en iteration av Newtons metod [17] . Inom datorgrafik är detta ett mycket effektivt sätt att normalisera en vektor.
float invSqrt ( float x ) { float xhalf = 0,5f * x ; union { flyta x ; int i ; } u ; u . x = x ; u . i = 0x5f375a86 - ( u . i >> 1 ); /* Nästa rad kan upprepas ett godtyckligt antal gånger för att öka precisionen */ u . x = u . x * ( 1,5f - x halv * u . x * u . x ); returnera u . x ; }Vissa VLSI implementerar att hitta den reciproka av kvadratroten med hjälp av en polynomuppskattning följt av Goldschmidt-iteration [18] .
Om , då är dess huvudrot lika med
Om , där a och b är reella tal och , då dess huvudsakliga rot är lika med
Detta kan kontrolleras genom att kvadrera [19] [20] . Här
är modulen för talet S . Huvudroten av ett komplext tal definieras som en rot med en icke-negativ reell del.