Algorithmen für mathematische Operationen
-
Wurst schrieb:
sondern auch Logarithmen, Wurzeln und andere, die mir gerade nicht einfallen
Vielleicht ist http://de.wikipedia.org/wiki/Bitalgorithmen auch ein guter Suchanfang.
-
Trigonometrische Funktionen kann man z.B. schon mit wenigen Gliedern ihrer Taylorreihe recht genau berechnen. Allerdings muß man meist etwas tricksen, damit der Algorithmus überall gleichermaßen stabil bleibt (etwa: bei Sinus und Cosinus das Argument auf [-π/2,π/2] normieren; bei ln nicht um die 0 entwickeln etc.).
Leider kann man die Implementation meist nicht im Quelltext der Laufzeitbibliothek nachlesen, da die meisten Compiler einfach die entsprechenden Features von FPU oder SSE-Einheit benutzen. Wie moderne CPUs das implementieren, weiß ich daher nicht.
Allerdings könntest du einfach im Quelltext von arbitrary-precision-Bibliotheken nachlesen, wie die das machen. Beispielsweise der
arcsin
in apfloat:// LGPL-Code (ApfloatMath.java, l. 1610ff) public static Apfloat asin(Apfloat x) throws ArithmeticException, ApfloatRuntimeException { Apfloat one = new Apfloat(1, Apfloat.INFINITE, x.radix()); Apcomplex i = new Apcomplex(Apfloat.ZERO, one); return ApcomplexMath.log(sqrt(one.subtract(x.multiply(x))).subtract(i.multiply(x))).imag().negate(); }
(Oh, und es wäre so viel schöner, wenn Java Operatorüberladung erlauben würde
)
-
Dein Suchwort ist CORDIC
-
audacia schrieb:
Trigonometrische Funktionen kann man z.B. schon mit wenigen Gliedern ihrer Taylorreihe recht genau berechnen. Allerdings muß man meist etwas tricksen, damit der Algorithmus überall gleichermaßen stabil bleibt (etwa: bei Sinus und Cosinus das Argument auf [-π/2,π/2] normieren; bei ln nicht um die 0 entwickeln etc.).
Die trigonometrischen Funktionen sind doch eher Beispiele für Funktionen die nicht so gut funktionieren. Überhaupt ist die Taylorentwicklung eher akademisch und wird vermutlich nirgends praktisch benutzt um Funktionswerte zu berechnen. Konvergiert einfach viel zu lahm und zu unzuverlässig im Vergleich zu spezialisierteren Verfahren.
-
Ja, den ln taylort wohl niemand ernsthaft; aber bei trigonometrischen Funktionen sind die Eigenschaften doch eigentlich nicht so schlecht, zumindest konvergiert die sin-/cos-Reihe doch recht fix?
Allerdings sagt die Wikipedia-Seite zu CORDIC (guter Verweis, das kannte ich noch nicht) auch, daß Taylorreihen in der Praxis selten sind. CORDIC scheint überhaupt ein prominenter Kandidat für solche Berechnungen zu sein.
Andererseits werden Taylorreihen durchaus für das Berechnen von Funktionen benutzt, wenn auch aufgrund der Defizite, die du erwähnst, eher als Zwischenschritt. Beispielsweise da: http://mesa.ece.wisc.edu/publications/cp_1995-04.pdf
-
@ SeppJ:
Und wieso sollte man im Computer die genaueste benutzen?
Was ist das für eine Frage?
Ich sollte sie benutzen, weil ich es will.Und wie definierst du beste?
Möglichst genau und schnell. Ersteres ist wichtiger. Wenn möglich natürlich einfach zu verstehne
@ volkard:
Ich werde es mir mal genauer ansehen, wenn ich Zeit finde (Schule hat ja wieder angefangen).
Beim Überfliegen ist mir aufgefallen: 1 < Argument < 4,768
Ist das generell für diesen Algorithmus so oder lässt sich das einfach ändern?@ audacia:
"Taylorreihe" - noch ein schöner Begriff, den ich mir ansehen muss, wenn ich Zeit habe.
Die Bibliothek sieht interessant aus und da es sie wohl auch in C++ gibt, muss ich nichtmal Java lernen@ DirkB:
Es gilt dasselbe wie für volkard und audacia - ich werde versuchen, mir CORDIC genauer anzusehen, sobald ich Zeit dafür finde.
-
Wurst schrieb:
@ SeppJ:
Und wieso sollte man im Computer die genaueste benutzen?
Was ist das für eine Frage?
Ich sollte sie benutzen, weil ich es will.Deine Frage war nach dem, wie das im Computer gemacht wird und da macht es keinen Sinn, auf extreme Genauigkeit zu gehen.
Möglichst genau und schnell. Ersteres ist wichtiger. Wenn möglich natürlich einfach zu verstehne
Wenn du mittendrin deine Frage änderst, kann man dir nicht optimal helfen. Ist deine Frage also "Welche einfach zu verstehenden Algorithmen könnt ihr mir nennen, um damit Logarithmen und Wurzeln numerisch zu berechnen?" ?
"Taylorreihe" - noch ein schöner Begriff, den ich mir ansehen muss, wenn ich Zeit habe.
Ehrliche Antwort: Du bist mathematisch noch nicht weit genug, um die anderen Verfahren zu verstehen.
-
Deine Frage war nach dem, wie das im Computer gemacht wird und da macht es keinen Sinn, auf extreme Genauigkeit zu gehen.
Ich hatte dabei nicht nur floats und doubles im Sinn, sondern auch Taschenrechner und noch komplexere Zahlen.
Vielleicht hätte ich den Thread auch im Mathe-Forum posten sollen, aber da wäre die Frage nach Geschwindigkeit nicht unbedingt sinnvoll gewesen.Wenn du mittendrin deine Frage änderst, kann man dir nicht optimal helfen. Ist deine Frage also "Welche einfach zu verstehenden Algorithmen könnt ihr mir nennen, um damit Logarithmen und Wurzeln numerisch zu berechnen?" ?
Ich dachte, der Clownsmiley wäre ein eindeutig verstandenes Zeichen für einen Scherz.
Ich suche einen Algorithmus, der Logarithmen, Wurzeln, trigonometrische Funktionen u.ä. berechnet. Die Eigenschaften, die er erfüllen soll, sind folgendermaßen nach Wichtigkeit geordnet:
1. Genauigkeit
2. Geschwindigkeit, Speicherverbrauch
3. VerständlichkeitJetzt klar?
Ehrliche Antwort: Du bist mathematisch noch nicht weit genug, um die anderen Verfahren zu verstehen.
Ich kann es trotzdem probieren.
Wenn du Recht hast, lege ich mir die Begriffe einfach zurück und versuche es in zwei Jahren nochmal.
-
Wurst schrieb:
Ich suche einen Algorithmus, der Logarithmen, Wurzeln, trigonometrische Funktionen u.ä. berechnet.
Das sind jeweils völlig verschiedene Ansätze.
Wurzeln berechnen kannst du dir zB mal reinziehen, da macht man idR ne Newton Iteration um x^2 - a = 0 zu lösen.
Das kannst du auch leicht mit deiner Schulmathematik (?) verstehen.
In dem Zusammenhang ist der bekannte "invsqrt" Algorithmus von Quake3 ganz lustig anzusehen.Wenns dich wirklich interessiert, kannst du auch versuchen mal irgendwas Einführendes in den Bereich Numerik zu lesen. Da kannst du dir erstmal die mathematischen Grundbegriffe aneignen. Taylor-Entwicklung musst du dir da aber vorher anschauen; das wird recht häufig gebraucht, für Fehlerabschätzungen und ähnliches.
-
Ich suche jeweils einen Algorithmus, der Logarithmen, Wurzeln, trigonometrische Funktionen u.ä. berechnet.
Verbessert.