Was wird schneller berechnet, oder oder ? , und sind positive Realzahlen mit .log a c b √ abcb>1
Welche Arten von Algorithmen werden Sie im Vergleich verwenden? Was sind ihre Komplexitäten?
Zum Beispiel, wenn oder c ≈ a b
Diese Frage wurde durch die Kommentare zur Frage zum Austausch von Mathematikstapeln inspiriert. Was ist der Zweck von Stirlings Annäherung an eine Fakultät? . Besonders die Kommentare von mjqxxxx , Thomas Andrews und mir.
Antworten:
In meiner Antwort auf diese Frage finden Sie einige verwandte Themen.
Im Allgemeinen können Computer nur addieren, subtrahieren, multiplizieren, dividieren und bitverschieben. Aus Gründen der Argumentation, nehmen wir an , dass Sie nicht die Berechnung im speziellen Fall , in dem Potenz von 2 ist und eine natürliche Zahl ist , weil dieser Fall einer Bit - Verschiebung reduziert und ist daher einfach. a bab a b
Wenn eine natürliche Zahl ist und Sie berechnen möchten , können Sie die Potenzierung der Additionskette verwenden . Jeder andere Fall in Ihrer Frage ist (im Allgemeinen) schwierig.a bb ab
Einige schnelle Algorithmen, die verwendet werden, um diese Funktionen mit hoher Genauigkeit zu approximieren, erfordern schwarze Magie. Um zu sehen , was ich meine „schwarze Magie“ , werfen Sie einen Blick auf diesem Blog - Eintrag von Martin Ankerl und einem zugehörigen Papier verbindet er in Neural Computation . Siehe auch den CORDIC- Algorithmus.
Ähnliche Arten von Bit-Flipping-Tricks werden in Hacker's Delight erklärt (der Link führt zur Companion-Website für das Buch).
Andere Methoden zur Berechnung guter Näherungen verwenden die numerische Analyse (siehe den Wikipedia-Artikel zur Approximationstheorie ). Ein schlechter Weg, dies zu tun, besteht darin, eine geeignete Differentialgleichung aufzustellen und sie mit einer numerischen Methode wie der Euler-Methode zu integrieren (wie gesagt, eine schlechte Annäherung, aber Sie können es tun). Ein besserer Weg, dies zu tun, ist die Verwendung von Seriennäherungen. Die Taylor-Reihe konvergiert viel zu langsam, so dass stattdessen so etwas wie eine Padé-Näherung oder eine andere Art der schnell konvergierenden Reihen-Näherung verwendet werden könnte (andere rationale Näherungen, Chebyshev-Reihen usw.).
Der Algorithmus, mit dem Sie die oben genannten Funktionen approximieren, hängt von Ihrer Architektur, den Geschwindigkeitsanforderungen und den Genauigkeitsanforderungen ab.
Das Problem beim Sprechen über Komplexität besteht darin, dass jeder Algorithmus nur eine Gleitkomma-Näherung der von Ihnen erwähnten Funktionen berechnet, sodass die Laufzeit sicherlich von der Genauigkeit abhängt, die Sie für Ihre Näherung benötigen. Selbst wenn ich das berücksichtige, denke ich nicht, dass die Komplexität der Berechnungen eine gute erste Annäherung an die Leistung ist. Die Größe Ihrer Eingänge wird in Bits gemessen (dh die Anzahl der Bits, die zur Darstellung von , undb ca b c ), die präzisionsabhängig sein werden und nicht von den Größen der numerischen Eingaben selbst abhängen. Aus praktischen Gründen wird die Genauigkeit der numerischen Darstellung von Zahlen nicht stark variieren (einfache Genauigkeit, doppelte Genauigkeit, vierfache Genauigkeit), und Sie entscheiden sich normalerweise nicht dafür, diese Genauigkeit basierend auf Schätzungen der Rechenkomplexität von Skalarfunktionen zu verwenden . Die relevanteste Metrik ist die Wanduhrzeit. Wenn Sie keine spezielle Architektur (eingebettete Systeme) verwenden oder Ihre Anwendung wirklich ein schnelles Exponential erfordert (siehe Link zum Blog-Beitrag und Link zur neuronalen Berechnung oben), sind die intrinsischen Bibliotheken in Ihrer Sprache der Wahl sind wahrscheinlich in Ordnung.
quelle
Dies ist eine gute Frage, da das Verständnis numerischer Algorithmen und der Leistung eine wichtige Voraussetzung für einen effektiven Computerwissenschaftler ist. Gleichzeitig ist es eine schlechte Frage, da die auferlegten Einschränkungen sie nicht ausreichend qualifizieren, um eine aussagekräftige Antwort zu geben.
Die Leistung der drei Berechnungen hängt stark von der Genauigkeit ab, die für das Endergebnis erforderlich ist, sowie von der Mindestgenauigkeit, die zur Darstellung der Operanden erforderlich ist. Sie qualifizieren , und als positive reelle Zahlen, aber wir müssen auch wissen, wie viele Binärziffern erforderlich sind, um sie genau darzustellen. Um die Leistungsüberlegungen für allgemeine reelle Zahlen zu verstehen, müssen wir zunächst verstehen, wie Computer Ganzzahlen darstellen und wie sie reelle Zahlen mithilfe von Gleitkommazahlen approximieren.b c d na b c dn
Wenn Computer mit einer Ganzzahl , entspricht die Anzahl der benötigten Binärziffern offensichtlich dem log der Größe der Ganzzahl plus einem zusätzlichen Bit für die Behandlung des Vorzeichens:2M 2
2 | M | + 1dn= log2|M|+1
Zum Beispiel kann die Zahl -8 mit 4 Binärziffern dargestellt werden. Aus Gründen der Leistung und Raumeffizienz sind arithmetische Logikeinheiten (ALUs), die für numerische Berechnungen von Ganzzahlen auf modernen Verarbeitungseinheiten verantwortlich sind, für die Verarbeitung von Mathematik auf Ganzzahlen bis zu einer festen Größe ausgelegt, wobei heutzutage d = 32 und d = am häufigsten sind 64. Nicht nur x86-Prozessoren wie in Ihrem Computer verfügen über ALUs, sie sind auch ein grundlegender Baustein der Computerarchitektur, der in der heutigen elektronischen Gesellschaft allgegenwärtig ist. Wenn Sie mit Videospielkonsolen vertraut sind, erinnern Sie sich vielleicht an den Nintendo 64, ein Videospielsystem, das nach der Größe (in Bit) benannt ist und für die die arithmetischen Logikeinheiten auf dem Prozessor der Konsole ausgelegt sind.
Ganzzahlige Additionen, Subtraktionen und Multiplikationen auf arithmetischen Logikeinheiten sind sehr effizient und erfordern normalerweise nicht mehr als mehrere Zyklen zur Berechnung. Divisionen sind weniger performant und können auf modernen Prozessoren bis zu mehreren Dutzend Zyklen erfordern. Die Leistung hängt sowohl von der Architektur der Verarbeitungseinheit (und der entsprechenden Implementierung der arithmetischen Logikeinheit) als auch von ihrer Frequenz ab. Beachten Sie, dass ein 64-Bit-Prozessor normalerweise Bit-Operanden mit der gleichen Geschwindigkeit für irgendwo zwischen 1 und 64 arithmetisch ausführen kann .xx x
Im allgemeinen Rechnen und insbesondere im wissenschaftlichen Rechnen ist die Ganzzahlmathematik für viele Berechnungen unhandlich, und es wird eine andere Darstellung von Zahlen benötigt, die sogenannte "Gleitkomma" -Darstellung. Gleitkommazahlen stellen einen Kompromiss zwischen der Funktionsweise moderner Mikroprozessoren (Transport von Daten in Bit-Hunks) und den Berechnungsanforderungen dar, indem Zahlen auf dem Prozessor in abgeschnittener wissenschaftlicher Notation unter Verwendung einer festen Basis (normalerweise oder ) und Darstellen der Zahl unter Verwendung von zwei ganzen Zahlen, einer Mantisse (in einigen Kreisen Signifikand) und einem Exponenten . Eine gegebene Zahl wird dann ungefähr dargestellt als:b b = 2 b = 10 s e xn b b=2 b=10 s e x
Ich sage ungefähr, weil es offensichtlich sein sollte, dass selbst einfache Rationalitäten wie nicht genau als Gleitkommazahl für die Standardbasen dargestellt werden können. Die Anzahl der dem Signifikanten zugewiesenen Ziffern bestimmt die Genauigkeit der Zahl, die relativ zu ihrer eigenen Größe ist. Der IEEE 754-Standard spezifiziert eine Reihe von Regeln für das erwartete Verhalten von Gleitkommazahlen, einschließlich der Bereiche des Signifikanten und der Mantisse (und des entsprechenden Bereichs und der Genauigkeit) für mehrere wichtige Werte von , so dass numerische Berechnungen innerhalb einiger Werte wiederholbar sind Toleranz. Die Funktionsweise von Gleitkommazahlen ist ziemlich subtil, was ich in dieser Antwort nicht erfassen kann. Für eine gute Einführung empfehle ich dn13 dn "Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte" .
In den letzten 50 Jahren wurde ein erheblicher intellektueller Aufwand in die Verbesserung der Prozessorfähigkeit investiert, um arithmetische Gleitkommaoperationen effizient zu berechnen. Auf modernen Prozessoren werden diese Berechnungen von einer oder mehreren Gleitkommaeinheiten (FPUs) verarbeitet, einer komplexeren Version der arithmetischen Logikeinheit, die für arithmetische Operationen mit Gleitkommazahlen ausgelegt ist und normalerweise für beide IEEE 754-spezifizierten 32 ausgelegt ist -Bit-Gleitkommazahlen (oft als "Floats" bezeichnet) und 64-Bit-Gleitkommazahlen (oft als "Doubles" bezeichnet) effizient. Ähnlich wie bei arithmetischen Logikeinheiten können Gleitkommaeinheiten häufig Addition, Subtraktion und Multiplikation in nur wenigen Zyklen berechnen, während die Division normalerweise etwas mehr erfordert.
In den meisten Fällen reichen 64-Bit-Gleitkomma-Doppelbilder nach IEEE 754 für numerische Berechnungen aus. Nehmen wir also an, dass , und jeweils als 64-Bit-Doppelbilder dargestellt werden und Sie an der Leistung des Drei Berechnungen als skalare Operationen auf einer Intel Nehalem-Architektur unter Verwendung der x87-Gleitkomma-Befehlsuntermenge, dh Sie sind nicht daran interessiert, diese Operationen in einer for-Schleife oder über einen Datenbereich zu berechnen, und Sie möchten die Vektorerweiterungen nicht verwenden . Informationen zur Befehlslatenz werden aus den hervorragenden Befehlsreferenztabellen von Agner Fog für Intel / AMD-Architekturen gesammelt .b ca b c
1 Allgemeine Potenzierung wird häufig mit folgender Identität implementiert:
Wobei entweder oder (in diesem Fall verwende ich ). Vorausgesetzt, Sie sind bereit, das Ergebnis etwas genauer zu machen (die x87-Einheit führt ihre Berechnungen mit einer Genauigkeit von 80 Bit durch, dies ist jedoch für bestimmte Wertebereiche für und nicht ausreichend ), kann diese Berechnung mit der FYL2X-Hardwareanweisung durchgeführt werden zu berechnen und dem F2XM1 Hardware Befehls (mit etwas Skalierungs Hilfe) berechnen . Angenommen, ~ 20 Zyklen für die Handhabung der Skalierung:2 e β = 2 a b t = a ⋅ log 2 b 2 tβ 2 e β=2 a b t=a⋅log2b 2t
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 Zyklen
2 Dies kann durch die Änderung der Basisidentität in zwei Logarithmen und eine Division umgewandelt werden und muss für ein genaues Ergebnis nicht neu skaliert werden.
2 * FYL2X + FDIV = 2 * 80 + (7 bis 27) = 167 bis 187 Zyklen
[3] Dies entspricht einer Division, gefolgt von einer Potenzierung, also [1] plus FDIV, ~ 175 Zyklen.
quelle
Lassen Sie mich sehen, ob ich die Frage umschreiben kann:
Antwort : Es hängt wirklich davon ab, ob c von a abhängig ist oder nicht und wie a mit b verglichen wird (größer als, kleiner als oder gleich).
quelle