Beste Antwort
1. Methode
= UNICHAR (8730) gibt das Quadratwurzelsymbol in Microsoft Excel an.
In Excel 2016 getestet
2. Methode
- Gehen Sie zu Tab einfügen und klicken Sie auf das Symbol in der Gruppe Symbole.
- Wählen Sie unter Symbole unter Operative mathematische Operatoren aus und verwenden Sie das Quadratwurzelsymbol.
Antwort
Die meisten modernen CPUs bieten nativ eine Quadratwurzeloperation. Mit einer typischen Programmiersprache auf typischer moderner Hardware wird dies mit ziemlicher Sicherheit letztendlich der Fall sein.
Sprechen wir also über die Methode, die fast alle modernen Allzweck-CPUs verwenden.
Zahlendarstellung
Als Erstes müssen wir verstehen, wie ein Computer tatsächlich die Art von Zahlen darstellt, über die wir sprechen. Sie werden in einer Art wissenschaftlicher Notation gespeichert.
Nun die Art von wissenschaftlicher Notation, mit der Sie möglicherweise vertraut sind, wenn eine Zahl wie -134,5 als -1,345 \ mal 10 ^ {2} dargestellt wird.
Jede Zahl, die nicht Null ist, kann in dieser Form dargestellt werden, die konzeptionell aus drei Teilen besteht: dem -Zeichen (dh der Zahl) positiv oder negativ), die Mantisse (eine Zahl zwischen 1 und 10, einschließlich 1, jedoch nicht einschließlich 10, in diesem Fall 1,345) und die Exponent (die Leistung, auf die der Radix angehoben wird, in diesem Fall 2; beachten Sie, dass der Exponent im Allgemeinen negativ oder Null sein kann).
Die Darstellung dass fast alle modernen Computer verwenden, ist sehr ähnlich, außer dass die Zahl in einer binären Darstellung anstatt einer dezimalen Darstellung gespeichert wird. Wenn Sie also das Vorzeichenbit und die Null ignorieren (da das Finden der Quadratwurzel von Null trivial ist und die Quadratwurzel einer negativen Zahl keine reelle Zahl ist), werden positive Zahlen tatsächlich in der Form m \ times 2 ^ {e} gespeichert, wobei m ist eine Zahl zwischen 1 und 2 (einschließlich 1, aber nicht einschließlich 2).
Diese Darstellung wird als „Gleitkomma“ bezeichnet, da Sie den Binärpunkt verschieben können (analog zum Dezimalpunkt, mit dem Sie möglicherweise vertraut sind, indem Sie den Exponenten anpassen.
Der Grund, warum dies alles wichtig ist, liegt darin, dass die CPU die Darstellung zur Berechnung der Quadratwurzeln verwendet. Angenommen, der Exponent ist gerade. Dann:
\ sqrt {m \ times 2 ^ {2 \ epsilon}} = \ sqrt {m} \ times 2 ^ {\ epsilon}
Ähnlich, wenn der Exponent ist ungerade, dann:
\ sqrt {m \ times 2 ^ {2 \ epsilon + 1}} = \ sqrt {2} \ sqrt {m} \ times 2 ^ {\ epsilon}
Denken Sie daran, dass m im Bereich [1,2] liegt. Dies bedeutet, dass wir das Problem auf die Berechnung der Quadratwurzel einer beliebigen Zahl auf die Berechnung der Quadratwurzel einer Zahl in diesem Bereich reduziert haben. Oder, wenn wir \ sqrt {2} nicht vorberechnen möchten, eine Zahl im Bereich [1,4]. In beiden Fällen haben wir das Problem dramatisch vereinfacht, da wir jetzt Methoden verwenden können, die sich in diesem Zahlenbereich gut verhalten.
Multiplikation und Division
Nun, da wir so weit gekommen sind, könnten Sie denken (wenn Sie sich die anderen Antworten angesehen haben), dass die Lösung jetzt darin besteht, eine Methode wie die Newton-Raphson-Iteration zu verwenden, um das Quadrat zu berechnen Wurzel. Um die Quadratwurzel von n zu berechnen, wählen Sie eine anfängliche Schätzung x\_0 und iterieren Sie:
x\_ {i + 1} = \ frac {1} {2} \ left (x\_i + \ frac {n} {x\_i) } \ right)
Diese Antwort lautet false . Nun, es ist nicht falsch, dass es Ihnen eine richtige Antwort gibt. Aber es ist falsch, dass kein selbstbewusster CPU-Designer (oder ein Bibliotheksschreiber, wenn er es in Software implementieren müsste) die Gleitkomma-Quadratwurzel auf diese Weise implementieren würde.
Die Division durch zwei ist sehr billig Operation in Binär (was, denken Sie daran, Basis 2 ist, also nur den Binärpunkt um eine Stelle verschiebt). Die andere Division ist jedoch eine sehr teure Operation, und in diesem Fall müssen Sie die Operation mehrmals ausführen.
Die Division ist in der Tat so teuer, dass moderne CPUs einen ähnlichen iterativen Algorithmus verwenden zu (aber nicht wirklich) Newton-Raphson-Iteration, um Division durchzuführen! Es ist klar, dass wir nicht dies in Hardware in einer inneren Schleife tun möchten.
Auf moderner Computerhardware ist die Ausführung viel billiger eine Multiplikationsoperation als eine Divisionsoperation. Der Grund dafür ist etwas komplex zu erklären; Dies hat damit zu tun, dass wir weit mehr Transistoren auf einen Chip setzen können als früher, und die Multiplikation ist ein Problem, bei dem Sie effizient auf viele Transistoren umsteigen können. Suchen Sie nach Wallace-Bäumen , wenn Sie an den Details interessiert sind.
Auf jeden Fall ist der Punkt, dass die Multiplikation eine vergleichsweise billige Operation ist. Wenn wir also die Quadratwurzeloperation eher als Multiplikation als als Division implementieren können, wäre dies besser.
Newton-Raphson, nehmen Sie zwei
Nun kommt die erste wichtige Erkenntnis: Anstatt die Quadratwurzel zu berechnen, berechnen Sie den Kehrwert der Quadratwurzel. Das heißt, anstelle von \ sqrt {n} wird \ frac {1} {\ sqrt {n}} berechnet. Es stellt sich heraus, dass diese Zahl viel einfacher zu berechnen ist. Wenn Sie die Quadratwurzel benötigen, multiplizieren Sie diese Zahl mit n, und Sie sind fertig.
Die Newton-Raphson-Methode für die reziproke Quadratwurzel sieht folgendermaßen aus . Wenn x\_0 eine anfängliche Schätzung für \ frac {1} {\ sqrt {n}} ist, iterieren Sie:
x\_ {i + 1} = \ frac {1} {2} x\_i \ left (3 – n {x\_i} ^ 2 \ right)
Auch hier ist die Division durch zwei recht billig, und alles andere ist Multiplikation und Addition / Subtraktion.
Dies ist eine großartige Möglichkeit zur Implementierung es in Software. Darüber hinaus ist darauf hinzuweisen, dass in vielen praktischen Situationen (z. B. Normalisierung eines Vektors mit dem Satz von Pythagoras) die reziproke Quadratwurzel tatsächlich nützlicher ist als die Quadratwurzel, da das Teilen durch eine Quadratwurzel weniger effizient ist als das Multiplizieren mit einem reziproken Quadrat root.
Dies ist jedoch normalerweise nicht in der Hardware implementiert.
Goldschmidts Algorithmus
Wir können uns nun den Goldschmidt-Algorithmus ansehen, der die Quadratwurzel und die reziproke Quadratwurzel zusammen berechnet.
Wenn b\_0 = n gegeben ist, können wir eine Reihe von Zahlen Y\_i finden, so dass b\_n = b\_0 { Y\_0} ^ 2 {Y\_1} ^ 2 \ cdots {Y\_ {n-1}} ^ 2 nähert sich 1, dann nähert sich y\_n = {Y\_0} {Y\_1} \ cdots {Y\_ {n-1}} \ frac {1} {\ sqrt {b\_0}} und x\_n = b\_0 {Y\_0} {Y\_1} \ cdots {Y\_ {n-1}} nähern sich \ sqrt {b\_0}.
Die von uns verwendete Reihe ist im Wesentlichen die Newton-Raphson-Aktualisierungsschritt:
\ begin {align *} b\_i & = b\_ {i-1} {Y\_ {i-1}} ^ 2 \\ Y\_i & = \ frac {1} {2 } (3 – b\_i) \ end {align *}
Und dann können wir die Quadratwurzel verfolgen:
\ begin {align *} x\_0 & = n Y\_0 \\ x\_ {i} & = x\_ {i-1} Y\_i \ end {align *}
Und die reziproke Quadratwurzel:
\ begin {align *} y\_0 & = Y\_0 \\ y\_ {i} & = y\_ {i-1} Y\_i \ end {align *}
Wenn wir jedoch x\_i und y\_i verfolgen, beachten Sie, dass b\_i = x\_ {i-1} y\_ {i-1}. Wir müssen also nie den Überblick über b\_i behalten:
\ begin {align *} Y\_i & = \ frac {1} {2} \ left (3 – b\_i \ right) \\ & = 1 + \ frac {1} {2} \ left (1 – b\_i \ right) \\ & = 1 + \ frac {1} {2} \ left (1 – x\_ {i-1} y\_ {i-1} \ right ) \ end {align *}
Und jetzt müssen wir Y\_i auch nicht mehr im Auge behalten:
\ begin {align *} x\_i & = x\_ {i-1} \ links (1 + \ frac {1} {2} \ links (1 – x\_ {i-1} y\_ {i-1} \ rechts) \ rechts) \\ & = x\_ {i-1} + x\_ {i- 1} \ frac {1} {2} \ left (1 – x\_ {i-1} y\_ {i-1} \ right) \\ y\_i & = y\_ {i-1} \ left (1 + \ frac {1 } {2} \ left (1 – x\_ {i-1} y\_ {i-1} \ right) \ right) \\ & = y\_ {i-1} + y\_ {i-1} \ frac {1} { 2} \ left (1 – x\_ {i-1} y\_ {i-1} \ right) \ end {align *}
Hier gibt es einige redundante Berechnungen, die wir entfernen können, was Folgendes nahe legt Algorithmus. Geben Sie Y als Annäherung an \ frac {1} {\ sqrt {n}} an und setzen Sie:
\ begin {align *} x\_0 & = n Y \\ y\_0 & = Y \ end {align * }
Dann iteriere:
\ begin {align *} r\_i & = \ frac {1} {2} \ left (1 – x\_i y\_i \ right) \\ x\_ {i +1} & = x\_i + x\_i r\_i \\ y\_ {i + 1} & = y\_i + y\_i r\_i \ end {align *}
Auch wenn die Division durch zwei billig ist, können wir dies ebenfalls vermeiden indem Sie h\_i = \ frac {1} {2} y\_i anstelle von y\_i verfolgen. Dies ist Goldschmidts Algorithmus.
Angenommen, Y ist eine Annäherung an \ frac {1} {\ sqrt {n}}. Set:
\ begin {align *} x\_0 & = n Y \\ h\_0 & = \ frac {Y} {2} \ end {align *}
Dann iteriere:
\ begin {align *} 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 {align *}
Dann konvergiert x\_i zu \ sqrt {n} und h\_n konvergiert zu \ frac {1} {2 \ sqrt {n}}.
Implementierung in Hardware
So weit so gut. Es ist sicherlich ein sehr einfacher Algorithmus. Aber warum ist es besser?
Moderne CPUs haben oft eine schnelle Schaltung, die eine optimierte Multiplikations-Akkumulations-Operation ausführt, die oft als fusionierte Multiplikations- bezeichnet wird. hinzufügen, oder kurz FMA. Wenn Sie den Verweis auf Wallace-Bäume früher nachgeschlagen haben, sollte Ihnen klar sein, wie FMA fast so effizient sein kann wie eine direkte Multiplikationsoperation.
FMA ist eines der nützlichsten Grundelemente, die es gibt. Wenn Sie ein Polynom auswerten müssen, zum Beispiel:
p (x) = a\_0 + a\_1 x + a\_2 x ^ 2 + \ cdots a\_n x ^ n
können Sie Horners verwenden Regel, die im Wesentlichen aus einer Reihe von FMAs besteht:
\ 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 {align *}
Die innere Schleife von Goldschmidts Algorithmus sind drei FMAs und sonst nichts.Aus diesem Grund ist dies ein Vorteil: Sie benötigen nur eine Art von Schaltung (möglicherweise nur eine Schaltung; beachten Sie, dass die zweiten beiden FMAs unabhängig sind und daher vom Pipelining profitieren können) sowie eine Steuerlogik, um alles zu implementieren. Und es ist eine Schaltung, die in vielen anderen Operationen nützlich ist, sodass Sie nicht viel Hardware nur für die Quadratwurzeloperation verschwenden.
Das vorletzte Puzzleteil ist, wie Sie eine gute Initiale erhalten schätzen, und die kurze Antwort ist, dass die beste Methode die Verwendung einer Tabellensuche ist. Selbst ein Tisch mit bescheidener Größe ist sehr effizient, da wir nur nach Quadratwurzeln in einem so kleinen Bereich suchen.
Das letzte Puzzleteil lautet: Woher wissen wir, wann wir fertig sind? iterieren? Die Antwort darauf ist, dass wir die Genauigkeit der von uns verwendeten Zahlen kennen und wissen, wie gut die anfängliche Schätzung ist. Daraus können wir die maximal erforderliche Anzahl von Iterationen im Voraus ermitteln. Wir führen also keine Schleife als solche durch, sondern führen die Iteration nur eine festgelegte Anzahl von Malen durch.