Neliöjuuren symbolin lisääminen Microsoft Exceliin

Paras vastaus

1. menetelmä

= UNICHAR (8730) antaa neliöjuuren symbolin Microsoft Excelissä.

Testattu Excel 2016: ssa

2. menetelmä

  • Siirry kohtaan Lisää välilehti ja napsauta -symbolia -symboliryhmässä.

  • Valitse Symbolit-kohdasta Matemaattiset operaattorit osajoukosta ja käytä neliöjuuren symbolia.

Vastaus

Useimmat modernit suorittimet tarjoavat neliöjuuritoiminnon natiivisti. Joten tyypillisellä nykyaikaisella laitteistolla tyypillisellä ohjelmointikielellä tämä on melkein varmasti mitä toiminta lopulta tulee olemaan.

Joten puhutaan menetelmästä, jota lähes kaikki modernit yleiskäyttöiset suorittimet käyttävät.

Lukuesitys

Ensinnäkin meidän on ymmärrettävä, kuinka tietokone edustaa todellisuudessa sellaisia ​​numeroita, joista puhumme. Ne on tallennettu eräänlaiseen tieteelliseen merkintätapaan.

Nyt sellainen tieteellinen merkintätapa, joka voi olla tuttu, jossa luku kuten -134,5 on esitetty -1,345 \ kertaa 10 ^ {2}.

Mikä tahansa luku, joka ei ole nolla, voidaan esittää tässä muodossa, jolla on käsitteellisesti kolme osaa: -merkki (eli luku on positiivinen tai negatiivinen), mantissa (luku välillä 1-10, mukaan lukien 1 mutta ei 10, tässä tapauksessa 1.345) ja eksponentti (teho, johon radiksi nousee, tässä tapauksessa 2; huomaa, että eksponentti voi olla negatiivinen tai nolla yleensä).

Esitys että melkein kaikki nykyaikaiset tietokoneet ovat hyvin samankaltaisia, paitsi että numero tallennetaan binääritiedon sijasta desimaalin sijaan. Joten ohittamatta merkkibittiä ja nollaa (koska nollan neliöjuuren löytäminen on triviaalia ja negatiivisen luvun neliöjuuri ei ole oikea luku), positiiviset luvut tosiasiallisesti tallennetaan muotoon m \ kertaa 2 ^ {e} missä m on luku välillä 1 ja 2 (mukaan lukien 1, mutta ei 2).

Tätä esitystä kutsutaan ”liukuluvuksi”, koska binääripistettä voidaan siirtää (analoginen kuin desimaalipilkku, jonka saatat tuntea) ympärillä säätämällä eksponenttia.

Syy, miksi tämä kaikki on tärkeää, johtuu siitä, että CPU käyttää esitystapaa neliöjuurien laskemiseen. Oletetaan, että eksponentti on tasainen. Sitten:

\ sqrt {m \ kertaa 2 ^ {2 \ epsilon}} = \ sqrt {m} \ kertaa 2 ^ {\ epsilon}

Vastaavasti, jos eksponentti on pariton, sitten:

\ sqrt {m \ kertaa 2 ^ {2 \ epsilon + 1}} = \ sqrt {2} \ sqrt {m} \ kertaa 2 ^ {\ epsilon}

Muista, että m on alueella [1,2]. Tämä tarkoittaa, että olemme supistaneet ongelman minkä tahansa luvun neliöjuuren laskemiseen yhtä vastaavan alueen neliöjuuren laskemiseen. Tai jos emme halua laskea \ sqrt {2} etukäteen, luku on alueella [1,4]. Kummassakin tapauksessa olemme yksinkertaistaneet ongelmaa dramaattisesti, koska voimme nyt käyttää menetelmiä, jotka käyttäytyvät hyvin kyseisellä numeroalueella.

Kertolasku ja jakaminen

Joten nyt, kun olemme päässeet pitkälle, saatat ajatella (jos olet tarkastellut muita vastauksia), että ratkaisu on nyt käyttää menetelmää, kuten Newton-Raphson-iteraatio, neliön laskemiseen juuri. Laskettaessa n: n neliöjuuri, valitse ensimmäinen arvaus x\_0 ja iteroi:

x\_ {i + 1} = \ frac {1} {2} \ left (x\_i + \ frac {n} {x\_i } \ oikea)

Tämä vastaus on väärä . No, se ei ole väärin, koska se antaa sinulle oikean vastauksen. Mutta se on väärin, koska yksikään itseään kunnioittava CPU-suunnittelija (tai mikä tahansa kirjaston kirjoittaja, jos heidän täytyisi toteuttaa se ohjelmistossa), ei toteuttaisi liukulukuinen neliöjuuri tällä tavalla.

Jako kahdella on erittäin halpa operaatio binäärissä (mikä, muista, on perusta 2, joten se vain siirtää binääripistettä yhdellä paikalla). Toinen jako on kuitenkin erittäin kallis toimenpide, ja tässä tapauksessa sinun on suoritettava operaatio useita kertoja.

Jako on itse asiassa niin kallista, että nykyaikaiset suorittimet käyttävät samanlaista iteratiivista algoritmia (mutta ei oikeastaan) Newton-Raphson-iterointiin jakamisen suorittamiseksi! Emme selvästikään emme halua tehdä tätä laitteistossa, sisäisessä silmukassa.

Nykyaikaisilla tietokoneilla on paljon halvempaa suorittaa kertolaskuoperaatio kuin jakooperaatio. Syy miksi on hieman monimutkainen selittää; se liittyy siihen, että voimme sovittaa paljon enemmän transistoreita sirulle kuin aikaisemmin pystyimme, ja kertolasku on ongelma, jonka avulla voit siirtyä tehokkaasti moniin transistoreihin. Etsi Wallace-puita , jos olet kiinnostunut yksityiskohdista.

Joka tapauksessa on kyse siitä, että kertolasku on suhteellisen halpa operaatio. Joten jos pystymme toteuttamaan neliöjuuren operaation kertomalla eikä jakamisella, se olisi parempi.

Newton-Raphson, ota kaksi

Nyt tulee ensimmäinen avainkäsitys: Neliöjuuren laskemisen sijaan laske neliöjuurin vastavuoroinen . Eli \ sqrt {n} -kohdan sijaan laske \ frac {1} {\ sqrt {n}}. On käynyt ilmi, että tämä on paljon helpompi laskea luku, ja jos tarvitset neliöjuuria, kerro tämä luku n: llä ja olet valmis.

Newton-Raphson-menetelmä vastavuoroiselle neliöjuurelle näyttää tältä . Jos x\_0 on alkuperäinen estimaatti \ frac {1} {\ sqrt {n}}, toista:

x\_ {i + 1} = \ frac {1} {2} x\_i \ left (3 – n {x\_i} ^ 2 \ oikea)

Jälleen jakaminen kahdella on melko halpaa, ja kaikki muu on kertolasku ja yhteenlasku / vähennys.

Tämä on hieno tapa toteuttaa se ohjelmistossa. Lisäksi on syytä huomauttaa, että monissa käytännön tilanteissa (esim. Vektorin normalisointi Pythagorasin lauseen avulla) vastavuoroinen neliöjuuri on itse asiassa hyödyllisempi kuin neliöjuuri, koska neliöjuurella jakaminen on vähemmän tehokasta kuin kertominen vastavuoroisella neliöllä juuri.

Tämä ei kuitenkaan ole tapana, jolla se yleensä toteutetaan laitteistossa.

Goldschmidtin algoritmi

Voimme nyt tarkastella Goldschmidtin algoritmia, joka laskee neliöjuuren ja vastavuoroisen neliöjuuren yhdessä.

Annetaan b\_0 = n, jos löydämme joukon numeroita Y\_i siten, että b\_n = b\_0 { Y\_0} ^ 2 {Y\_1} ^ 2 \ cdots {Y\_ {n-1}} ^ 2 lähestyy 1, sitten y\_n = {Y\_0} {Y\_1} \ cdots {Y\_ {n-1}} lähestyy \ frac {1} {\ sqrt {b\_0}} ja x\_n = b\_0 {Y\_0} {Y\_1} \ cdots {Y\_ {n-1}} lähestyvät \ sqrt {b\_0}.

Käytetty sarja on lähinnä Newton-Raphson -päivitysvaihe:

\ aloita {tasaa *} b\_i & = b\_ {i-1} {Y\_ {i-1}} ^ 2 \\ Y\_i & = \ frac {1} {2 } (3 – b\_i) \ end {tasaa *}

Ja sitten voimme seurata neliöjuuria:

\ begin {tasaa *} x\_0 & = n Y\_0 \\ x\_ {i} & = x\_ {i-1} Y\_i \ end {tasaa *}

Ja vastavuoroinen neliöjuuri:

\ begin {align *} y\_0 & = Y\_0 \\ y\_ {i} & = y\_ {i-1} Y\_i \ end {align *}

Mutta jos seuraamme x\_i: tä ja y\_i: tä, huomaa, että b\_i = x\_ {i-1} y\_ {i-1}. Joten meidän ei koskaan tarvitse seurata b\_i:

\ begin {align *} Y\_i & = \ frac {1} {2} \ left (3 – b\_i \ right) \\ & = 1 + \ frac {1} {2} \ vasen (1 – b\_i \ oikea) \\ & = 1 + \ frac {1} {2} \ vasen (1 – x\_ {i-1} y\_ {i-1} \ oikea ) \ end {align *}

Ja nyt, eikä meidän tarvitse myöskään seurata Y\_i:

\ begin {align *} x\_i & = x\_ {i-1} \ vasen (1 + \ frac {1} {2} \ vasen (1 – x\_ {i-1} y\_ {i-1} \ oikea) \ oikea) \\ & = x\_ {i-1} + x\_ {i- 1} \ frac {1} {2} \ vasen (1 – x\_ {i-1} y\_ {i-1} \ oikea) \\ y\_i & = y\_ {i-1} \ vasen (1 + \ frac {1 } {2} \ vasen (1 – x\_ {i-1} y\_ {i-1} \ oikea) \ oikea) \\ & = y\_ {i-1} + y\_ {i-1} \ frac {1} { 2} \ vasen (1 – x\_ {i-1} y\_ {i-1} \ oikea) \ end {tasaa *}

Tässä on tarpeeton laskenta, jonka voimme poistaa ja ehdottaa seuraavaa algoritmi. Koska Y on likimääräinen \ frac {1} {\ sqrt {n}}, määritä:

\ begin {align *} x\_0 & = n Y \\ y\_0 & = Y \ end {align * }

Sitten iteroi:

\ aloita {tasaa *} r\_i & = \ frac {1} {2} \ vasen (1 – x\_i y\_i \ oikea) \\ x\_ {i +1} & = x\_i + x\_i r\_i \\ y\_ {i + 1} & = y\_i + y\_i r\_i \ end {tasaa *}

Vaikka jakaminen kahdella on halpaa, voimme välttää myös sen pitämällä kirjaa h\_i = \ frac {1} {2} y\_i sijasta y\_i. Tämä on Goldschmidtin algoritmi.

Oletetaan, että Y on likimääräinen \ frac {1} {\ sqrt {n}}. Aseta:

\ begin {tasaus *} x\_0 & = n Y \\ h\_0 & = \ frac {Y} {2} \ end {tasaus *}

Sitten iteroi:

\ begin {tasaus *} r\_i & = \ frac {1} {2} – x\_i h\_i \\ x\_ {i + 1} & = x\_i + x\_i r\_i \\ h\_ {i + 1} & = h\_i + h\_i r\_i \ end {tasaa *}

Sitten x\_i yhtyy \ sqrt {n} ja h\_n lähtee \ frac {1} {2 \ sqrt {n}}.

Tämän toteuttaminen laitteistossa

Toistaiseksi hyvä. Se on varmasti hyvin yksinkertainen algoritmi. Mutta miksi se on parempi?

Nykyaikaisilla suorittimilla on usein nopea piiri, joka suorittaa optimoidun kerro-kerää -operaation , jota usein kutsutaan fused multiply- Lisää, tai FMA lyhyesti. Jos etsit viittausta Wallace-puihin aikaisemmin, sinun pitäisi olla selvää, kuinka FMA voi olla melkein yhtä tehokas kuin suora kertolaskuoperaatio.

FMA on yksi hyödyllisimmistä alkeista, joita sinulla on. Jos sinun on arvioitava esimerkiksi polynomi:

p (x) = a\_0 + a\_1 x + a\_2 x ^ 2 + \ cdots a\_n x ^ n

voit käyttää Hornerin sääntö, joka on lähinnä joukko FMA: ita:

\ begin {align *} p\_ {n-1} & = a\_ {n-1} + x a\_n \\ p\_ {n-2} & = a\_ {n-2} + x p\_ {n-1} \\ & \ vdots \\ p\_1 & = a\_1 + x p\_2 \\ p\_0 & = a\_0 + x p\_1 \ end {tasaa *}

Goldschmidtin algoritmin sisäinen silmukka on kolme FMA: ta eikä mitään muuta.Siksi se on etu: tarvitset vain yhden tyyppisen piirin (mahdollisesti vain yhden piirin; huomaa, että kaksi toista FMA: ta ovat riippumattomia ja voivat hyötyä putkistosta) sekä jonkin verran ohjauslogiikkaa kaiken toteuttamiseksi. Ja se on piiri, josta on hyötyä monissa muissa toiminnoissa, joten et tuhlaa paljon laitteistoa vain neliöjuuritoiminnalle.

Palapelin toiseksi viimeinen kappale on miten saada hyvä alkukirjain arvio, ja lyhyt vastaus on, että paras tapa on käyttää taulukkoa. Jopa vaatimaton kokoinen pöytä, koska etsimme vain neliömäisiä juuria niin pieneltä alueelta, on varsin tehokas.

Palapelin viimeinen pala on: Mistä tiedämme, kun olemme valmiit iterointi? Ja vastaus on, että tiedämme käyttämiemme numeroiden tarkkuuden ja kuinka hyvä alkuperäinen arvio on. Siitä voimme selvittää enimmäismäärän etukäteen vaadittavia toistoja. Joten emme itse silmukoita sellaisenaan, teemme vain iteroinnin kiinteän määrän kertoja

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *