2010-03-19 5 views
18

Ich habe irgendwo in einem Artikel gelesen, dass trigonometrische Berechnungen im Allgemeinen teuer sind. Ist das wahr? Und wenn ja, verwenden sie Trig-Lookup-Tabellen, oder?Ist die Trigonometrie rechenintensiv?

EDIT: Hmm, also, wenn das einzige, was sich ändert, ist die Grad (genau zu 1 Grad), wäre eine Nachschlagetabelle mit 360 Einträge (für jeden Winkel) schneller?

+4

Nachschlagetabellen wurden häufig auf älteren Mikroprozessoren verwendet, z. B. eine 8-Bit-CPU für einen Roboterarm, der weder Hardware-Gleitkomma noch Multiplikation (in einem bestimmten Fall der 6502) hatte. Die Geschwindigkeitsvorteile sind nicht mehr annähernd so wichtig. –

+1

Yay für technologische Fortschritte :) – DMan

Antwort

17

Teuer ist ein relativer Begriff.

Die mathematischen Operationen, die am schnellsten ablaufen, sind diejenigen, die direkt von Ihrem Prozessor ausgeführt werden können. Sicherlich werden ganzzahlige addieren und subtrahieren unter ihnen sein. Je nach Prozessor kann es auch Multiplikation und Division geben. Manchmal kann der Prozessor (oder ein Coprozessor) Fließkommaoperationen nativ verarbeiten.

Kompliziertere Dinge (z. B. Quadratwurzel) erfordern eine Reihe dieser Low-Level-Berechnungen durchgeführt werden. Diese Dinge werden normalerweise mithilfe von Mathematikbibliotheken erreicht (die über die nativen Operationen geschrieben werden, die der Prozessor ausführen kann).

All dies passiert sehr, sehr schnell in diesen Tagen, so "teuer" hängt davon ab, wie viel Sie tun müssen, und wie schnell Sie es brauchen, um zu geschehen.

Wenn Sie Echtzeit-3D-Rendering-Software schreiben, müssen Sie möglicherweise viele clevere mathematische Tricks und Verknüpfungen verwenden, um jede Geschwindigkeit aus Ihrer Umgebung herauszuholen.

Wenn Sie an typischen Geschäftsanwendungen arbeiten, besteht die Möglichkeit, dass die von Ihnen durchgeführten mathematischen Berechnungen nicht wesentlich zur Gesamtleistung Ihres Systems beitragen.

+1

Tatsächlich ist die Quadratwurzel so häufig, dass sie sehr oft in Hardware implementiert wird. Mit komplizierteren Funktionen (z.B.trig) es gibt nicht viel Vorteil, sie in Hardware zu implementieren, obwohl es in einigen Architekturen passiert (x87 wäre das bekannteste) – slacker

+2

@slacker - wenn Sie sagen "in Hardware" bedeuten bedeuten, dass FSQRT ist eine kleine Anzahl von Taktzyklen, oder meinst du einfach, es ist eine einzige Anweisung und in Nano/Microcode implementiert? Ich weiß, dass es Hardware-Designs für das Quadratwurzel-Feature gibt, aber ich glaube nicht, dass sie in den meisten Prozessoren waren. – NVRAM

7

Da sin(), cos() und tan() mathematische Funktionen sind, die durch Summieren einer Serie berechnet werden, verwenden Entwickler manchmal Nachschlagetabellen, um die teure Berechnung zu vermeiden.

Der Kompromiss ist in Genauigkeit und Speicher. Je größer die Notwendigkeit für die Genauigkeit ist, desto größer ist die Menge an Speicher, die für die Nachschlagetabelle benötigt wird.

Werfen Sie einen Blick auf die folgende Tabelle, die bis 1 Grad genau ist.

http://www.analyzemath.com/trigonometry/trig_1.gif

+0

So ziemlich alle mathematischen Funktionen (neben einfachen + und -, etc) sind in der Regel ziemlich teuer? – DMan

+2

Alle Fließkommaoperationen sind ziemlich teuer. Even + beinhaltet eine ganze Reihe von Vergleichen, ganzzahligen Additionen und Bitverschiebungen. Natürlich viel billiger als Sünde, cos, tan. – kennytm

+1

@Kenny - ja, du hast recht, da sie von Natur aus nicht als ganze Zahlen dargestellt werden :) – Codebrain

0

ja es ist. trig-Funktionen werden durch Aufsummieren einer Reihe berechnet. Im Allgemeinen wäre es also viel teurer als eine einfache mathematische Operation. Das gleiche gilt für sqrt

+5

Taylor-Erweiterung ist NICHT, wie moderne FPUs trigonometrische Funktionen berechnen. Sie verwenden sukzessive Approximationsmethoden, die pro Iteration viel mehr Genauigkeitsziffern liefern als Taylorreihen. (Der vorherige Verweis auf CORDIC wurde entfernt, der in eingebetteten Anwendungen verwendet wird, bei denen Platz wichtiger ist als die Geschwindigkeit) –

1

Wenn Sie immer wissen, die Winkel, die Sie berechnen, können Sie sie in einer Variablen speichern, anstatt sie jedes Mal zu berechnen. Dies gilt auch für Ihren Methoden-/Funktionsaufruf, bei dem sich Ihr Blickwinkel nicht ändert. Sie können schlau sein, indem Sie einige Formeln verwenden (sin (Theta) aus sin (Theta/2) berechnen, wissen, wie oft sich die Werte wiederholen - sin (Theta + 2 * pi * n) = sin (theta)) und die Berechnung reduzieren. Siehe this wikipedia artikel

2

Während die schnelle Antwort ist, dass sie teurer sind als die primitiven mathematischen Funktionen (Addition/Multiplikation/Subtraktion etc ...) sind sie nicht-teuer in Bezug auf die menschliche Zeit. In der Regel ist der Grund, warum Menschen sie mit Nachschlagetabellen und Approximationen optimieren, weil sie sie möglicherweise zehntausende Male pro Sekunde aufrufen und jede Mikrosekunde wertvoll sein könnte.

Wenn Sie ein Programm schreiben und es nur ein paar Mal pro Sekunde aufrufen müssen, sind die eingebauten Funktionen bei weitem schnell genug.

2

Ich würde empfehlen, ein Testprogramm zu schreiben und sie für sich zu timing. Ja, sie sind langsam im Vergleich zu Plus und Minus, aber sie sind immer noch Einzel-Prozessor-Anweisungen. Es ist unwahrscheinlich, dass es ein Problem ist, es sei denn, Sie machen eine sehr enge Schleife mit Millionen von Iterationen.

2

Ja, (relativ zu anderen mathematischen Operationen multiplizieren, dividieren): Wenn Sie etwas Echtzeit machen (Matrix-Ops, Videospiele, was auch immer), können Sie Lose von Zyklen, indem Sie Ihre trigonometrischen Berechnungen aus verschieben deine innere Schleife.

Wenn Sie nicht etwas in Echtzeit tun, dann sind sie nicht teuer (relativ zu Operationen wie das Lesen einer Menge Daten von der Festplatte, das Generieren einer Webseite usw.). Trig-Ops werden hoffentlich in Hardware von Ihrer CPU ausgeführt (die Milliarden von Gleitkommaoperationen pro Sekunde ausführen kann).

+1

Mit Ausnahme der x86-CPUs kenne ich keine CPU-Architektur, egal ob Coprozessor eingebaut (PPC) oder extern (ARM), der in Hardware triggert. Sogar x86-CPUs machen sie nicht wirklich in Hardware, sie bieten einen Opcode, um sie auszuführen, aber intern läuft ein Mikrocode, der diese Werte auf der Grundlage einfacher Arithmetik berechnet (wie add, sub, mul und div). GPUs vielleicht, aber für CPUs sind Trig-Ops sehr ungewöhnlich. – Mecki

8

Auf dem Intel x86-Prozessor erfordert Gleitkomma-Addition oder Subtraktion 6 Taktzyklen, Multiplikation erfordert 8 Taktzyklen und Division 30-44 Taktzyklen. Cosinus benötigt jedoch zwischen 180 und 280 Taktzyklen.

Es ist immer noch sehr schnell, da das x86 diese Dinge in Hardware tut, aber es ist viel langsamer als die grundlegenden mathematischen Funktionen.

+8

Eigentlich ist das ziemlich veraltete Information. Heutzutage benötigen FP-Additionen 3-4 Zyklen und FP-Multiplikationen 4-5 Zyklen, abhängig vom Prozessor. Beachten Sie, dass diese Operationen vollständig in Pipelines ausgeführt werden, sodass Sie jeden Taktzyklus eine neue Addition und Multiplikation starten können. Divisionen dauern typischerweise 20-25 Zyklen und werden nicht pipelined. Neuere Prozessoren können auch zu einem frühen Zeitpunkt aus einer Division aussteigen, wenn der Divisor einigermaßen rund ist - was in einigen Fällen nur 6 Zyklen erfordert. – slacker

+2

Es sei denn, Sie sprechen über den Pentium 4. Was ist nur langsam für was auch immer es tut. Duh. – slacker