Effektives potenzieren



  • Hallo Leute!

    es geht um das eigentlich ganz einfache problem der potenzrechnung. Bisher habe ich immer pow() für sowas genutzt, allerdings kostet die Funktion viel zeit wenn ich pow() häufig verwende.

    Gibt es also eine andere Möglichkeit Potenzen zu berechnen? Es geht dabei nicht nur im gerade sondern auch gebrochene Potenzen.


  • Mod

    Im allgemeinen Fall: Nein, das ist so schnell, wie es geht.

    Wenn du dich vom allgemeinen Fall weg begibst, dann mag es ein paar Tricks geben:

    • Kleine ganzzahlige Potenzen kann man einfach so im Code hinschreiben. Oft hat man auch Fälle, wo man beispielsweise erst x^6 und später x^12 braucht. Dann kann man abkürzen und erst x^6 ausrechnen, dann x62.
    • Wenn niedrige Genauigkeit ausreicht, kann man auch ungenauere, schnellere Verfahren benutzen.
    • Die üblichen Tricks, um Rechnungen schneller zu bekommen, gelten natürlich immer noch. Mach es dem Compiler leicht, sich oft wiederholende Rechnungen zu vectorisieren. Hilf zur Not per Hand nach, indem du entsprechende Intrinsiks benutzt.
    • Und natürlich der wichtigste Trick: Überleg dir, ob die Rechnung wirklich gemacht werden muss oder ob man das vielleicht umformen kann, um weniger pow-Aufrufe zu haben


  • SeppJ schrieb:

    Im allgemeinen Fall: Nein, das ist so schnell, wie es geht.

    Wenn du dich vom allgemeinen Fall weg begibst, dann mag es ein paar Tricks geben:

    • Kleine ganzzahlige Potenzen kann man einfach so im Code hinschreiben. Oft hat man auch Fälle, wo man beispielsweise erst x^6 und später x^12 braucht. Dann kann man abkürzen und erst x^6 ausrechnen, dann x62.
    • Wenn niedrige Genauigkeit ausreicht, kann man auch ungenauere, schnellere Verfahren benutzen.
    • Die üblichen Tricks, um Rechnungen schneller zu bekommen, gelten natürlich immer noch. Mach es dem Compiler leicht, sich oft wiederholende Rechnungen zu vectorisieren. Hilf zur Not per Hand nach, indem du entsprechende Intrinsiks benutzt.
    • Und natürlich der wichtigste Trick: Überleg dir, ob die Rechnung wirklich gemacht werden muss oder ob man das vielleicht umformen kann, um weniger pow-Aufrufe zu haben

    Verstehe, hatte eh nicht viel Hoffnung. Vielen Dank Sepp!

    PS.: ich nehme nicht an dass es ne Alternative zur atan() Funktion gibt? Die schluckt nämlich auch enorm Zeit.


  • Mod

    Freddy_Kay schrieb:

    PS.: ich nehme nicht an dass es ne Alternative zur atan() Funktion gibt? Die schluckt nämlich auch enorm Zeit.

    Dazu gilt genau das gleiche, wie zu pow. All dies sind nun einmal aufwändige Rechnungen. Stell dir nur mal vor, du müsstest diese Rechnungen ohne Computer durchführen, wie viel länger diese dauern würden* als zum Beispiel eine schriftliche Multiplikation. Der Computer kann nicht zaubern.

    Beim atan (und anderen inversen trigonometrischen Funktionen) möchte ich aber noch den Punkt

    Und natürlich der wichtigste Trick: Überleg dir, ob die Rechnung wirklich gemacht werden muss oder ob man das vielleicht umformen kann, um weniger pow-Aufrufe zu haben

    gesondert hervorheben. Bei diesen Funktionen denken erstaunlich viele Leute, dass man sie dauernd bräuchte. Dabei reicht es für das gewünschte Ergebnis oft, dass man sie einmalig ganz am Ende der Rechnung benutzt.

    *: Die wahrscheinlich nötige mehrtägige Literatursuche, wie man den atan oder gebrochene Potenzen überhaupt effektiv ausrechnen kannst, darfst du rausrechnen.


  • Mod

    @SeppJ: Ja, bei trigonometrischen Funktionen sollte man nicht bei Identitäten sparen um die Aufrufzahlen klein zu halten. Da kann man erstaunlich viel sparen wenn man eine glückliche Hand (oder Wolfram Alpha) hat.



  • Arcoth schrieb:

    @SeppJ: Ja, bei trigonometrischen Funktionen sollte man nicht bei Identitäten sparen um die Aufrufzahlen klein zu halten. Da kann man erstaunlich viel sparen wenn man eine glückliche Hand (oder Wolfram Alpha) hat.

    Vor 20 Jahren hat sich's geändert, glaub ich, daß nach dem a=sin(x) das b=cos(x) schneller als das b=sqrt(1-a*a) wurde. Ich fürchte, das passierte zwischenzeitlich mit allerhand kleinen Umformungen.



  • Ich werfe an der Stelle vielleicht einfach mal Lookpup-Tables ein...


Anmelden zum Antworten