Look Up Table für Tangens ???



  • Hallo NG!

    Gibt es einen Look Up Table für den Tangens? Den mathematisch zu berechnen ist ja sehr aufwendig und zeitintensiv. Ich suche daher nach einem Algorithmus, der nach dem ersten Funktionsaufruf auf eine LookUpTabelle zurückgreift und sich aus dieser die Werte nimmt.

    Schwierig (und der Grund weshalb ich nicht weiterkomme): Ich kann den Wertebereich nicht einschränken. y = tan(x) wobei x einen absolut beliebigen Wert (Fliesskommazahl) annehmen kann ...

    Achja: Das hier ist keine Programmieraufgabe. Ich möchte eine mathematische Funktion auf Bildpunkte anwenden. Also auf jeden Bildpunkt separat. Bei grossen Bildern würde der tangens ein paar Millionen mal aufgerufen werden. Deshalb suche ich nach einer eleganteren Lösung, die tangens-Berechnung durchzuführen.

    Kann mir dabei jemand helfen?

    THX
    2Atlantis



  • Na wenn du keine in C++ hast, dann bau dir doch selbst eine.

    Entweder du rechnest sie beim Aufruf des Programmes einmal komplett durch und speicherst sie in einem globalen Array, so dass du immer darauf zugreifen kannst.

    Oder du schreibst ein anderes Tool, dass diese Aufgabe einmal übernimmt und die Ergebnisse in ner Datei speichert. Dann musst du beim Start deines Hauptprogrammes nur diese Werte in ein Array einlesen und hast sie so immer da.



  • 2Atlantis schrieb:

    Schwierig (und der Grund weshalb ich nicht weiterkomme): Ich kann den Wertebereich nicht einschränken. y = tan(x) wobei x einen absolut beliebigen Wert (Fliesskommazahl) annehmen kann ...

    Der Tangens ist periodisch. Du musst x nur auf ein passendes Intervall runter rechnen (-Π/2 bis Π/2 IIRC) und dann die Werte in der Lookuptable nachschauen. Schau dir am besten mal den Graph der Tangensfunktion an, dann weißt du was ich meine.



  • DarthZiu schrieb:

    Na wenn du keine in C++ hast, dann bau dir doch selbst eine.

    Entweder du rechnest sie beim Aufruf des Programmes einmal komplett durch und speicherst sie in einem globalen Array, so dass du immer darauf zugreifen kannst.

    Oder du schreibst ein anderes Tool, dass diese Aufgabe einmal übernimmt und die Ergebnisse in ner Datei speichert. Dann musst du beim Start deines Hauptprogrammes nur diese Werte in ein Array einlesen und hast sie so immer da.

    ja, ich kann doch aber vor Programmstart nicht die Genauigkeit kennen, mit der die Tangenswerte abgerufen werden. Von daher ist diese Lösung eher ungenau.

    MaSTaH schrieb:

    2Atlantis schrieb:

    Schwierig (und der Grund weshalb ich nicht weiterkomme): Ich kann den Wertebereich nicht einschränken. y = tan(x) wobei x einen absolut beliebigen Wert (Fliesskommazahl) annehmen kann ...

    Der Tangens ist periodisch. Du musst x nur auf ein passendes Intervall runter rechnen (-Π/2 bis Π/2 IIRC) und dann die Werte in der Lookuptable nachschauen. Schau dir am besten mal den Graph der Tangensfunktion an, dann weißt du was ich meine.

    Hast Du dafür mal ein Programmcode-Beispiel? Ich habe im Netz leider keins gefunden...



  • 2Atlantis schrieb:

    Hast Du dafür mal ein Programmcode-Beispiel? Ich habe im Netz leider keins gefunden...

    Wofür jetzt genau?
    Wie MaSTaH schon geschrieben hat, ist die Tangensfunktion periodisch, d.h. du kannst das Intervall auf [\text{-}\frac {\Pi} 2,\frac \Pi 2] beschränken. Nutzt du jetzt noch aus, daß in diesem Bereich tan(-x)=-tan(x) gilt, brauchst du nur noch Werte für [0,\frac \Pi 2]. Also einmal ein paar (äquidistante) Punkte im Intervall durchlaufen und in einem Array speichern.



  • Ein Beispiel such ich, in dem der tangens mal als lookup realisiert ist .. und eine sehr geringe schrittweite bestitzt ...



  • MaSTaH schrieb:

    Der Tangens ist periodisch.

    👎
    bist du sicher?



  • ssm schrieb:

    MaSTaH schrieb:

    Der Tangens ist periodisch.

    👎
    bist du sicher?

    👍
    Ja!

    ( http://de.wikipedia.org/wiki/Bild:GraphTangensfunktion.png )



  • ja klar ist der Tangens periodisch mit π



  • @fubar and 2Atlantis
    danke 👍

    @MaSTaH
    entschuldige, du hatest Recht 😞



  • entweder du erstellst ne lookuptable, die für deine gewünschte genauigkeit eingerichtet ist, oder du hast keine chance. Es wird im zweifesfall immer werte geben, die du nicht vorberechnet hast.



  • otze schrieb:

    entweder du erstellst ne lookuptable, die für deine gewünschte genauigkeit eingerichtet ist, oder du hast keine chance.

    Warum? Man kann auch einfach ein paar Punkte weniger nehmen und dann sinnvoll interpolieren ...

    Edit: Oder meinst du die Werte der tan-Fkt.? Vielleicht habe ich dich nur falsch verstanden.



  • Hey das mit der Interpolation ist eine coole Idee ... Hast du ein Beispiel ???



  • Naja, es gibt sehr viele Möglichkeiten: Willst du die komplette tan-Fkt. auf dem Intervall (rationale Interpolation wäre vielleicht sinnvoll) oder stückweise die Werte der Tabelle linear, kubisch (,...) interpolieren?
    Du könntest z.B. eine Tabelle anlegen, und die Werte dazwischen stückweise linear interpolieren, d. h. du legst einfach Geraden durch die berechneten Werte und approximierst so den Wert der tan-Fkt.
    Vielleicht hilft auch http://de.wikipedia.org/wiki/Interpolation .
    Ein fertiges Beispielprogramm habe ich allerdings nicht. Aber mit Google müßte da einiges zu finden sein ...


Log in to reply