[gelöst] Logarithmus für große Zahlen
-
Hallo,
Ich bin auf der Suche nach einem Alg. der den nat. Logarithmus (bzw. beliebige Basis) von sehr großen Zahlen berechnet.
Bin nämlich auf das Problem gestoßen, dass math.log bei 1e309 aussteigt.
-
Nicht log. double steigt bei etwa 10^309 aus.
-
daran hatte ich ganz vergessen zu denken, danke.
gibt es vllt einen Alg. auf gmp-Basis?
bzw. ein Alg. der bei so einer Größenordnung und größer gut zum gewünschten Ergebnis konvergiert?
-
Wie wärs mit einer Taylorentwicklung?
-
Auf den Alg. bin ich auch schon gestoßen, allerdings konvergiert der nicht so besonders für große x
-
Warum willst du überhaupt einen Logarithmus von einer großen Zahl ziehen?!
Je nach dem, wie groß sie ist bist du wahrscheinlich mit der Annahme "log_2 x == Anzahl der Binärstellen" am Besten bedient. Du kannst dann ja ohne Weiteres (mit genaueren Werten von std::log) auf andere Basen umrechnen.
-
ZeroCoder schrieb:
Auf den Alg. bin ich auch schon gestoßen, allerdings konvergiert der nicht so besonders für große x
Du mußt ja nicht unbedingt um die 0 entwickeln.
-
Jester schrieb:
ZeroCoder schrieb:
Auf den Alg. bin ich auch schon gestoßen, allerdings konvergiert der nicht so besonders für große x
Du mußt ja nicht unbedingt um die 0 entwickeln.
und was muss ich dann an dem Alg. verändern, um in dem gewünschten Bereich zu entwickeln?
-
Lies dir den Artikel doch durch, dann wirst du verstehen ;).
-
.filmor schrieb:
Lies dir den Artikel doch durch, dann wirst du verstehen ;).
Hab ich auch schon die ganze Zeit gemacht und habe versucht dahinter zukommen, habs jetzt glaub ich auch so halb. Allerdings stellt sich mir jetzt die Frage wie das gehen soll.
Also ich brauche dazu immer die nächste Ableitung der Funktion (in meinem Fall von ln(x)).
Und a stellt den Entwicklungspunkt dar, um den dann die Reihe für mein gewünschtes x konvergiert.
Aber da die Reihe mit der Ausgangsfunktion startet steh ich ja wieder vor dem Problem ln von einer großen Zahl zu berechnen, da ja a dann auch in der Nähe von meinem x liegen muss.Entweder drehe ich mich völlig im kreis, oder ich habe irgendwo einen Denkfehler?!
-
Die Taylorreihe im gleichen Punkt zu entwickeln ist natürlich sinnlos, und vor allem wäre sie dann unnötig, da du den Wert ja hast
Aber es gibt noch andere Werte zwischen 0 und deinem Wert.
Mit dem Lagrangschen Restglied
http://de.wikipedia.org/wiki/Taylor-Formel#Restgliedformeln
kannst du abschätzen, wie weit du dann entwickeln musst.
-
Taylor-Entwicklung?
Wie wärs mit Logarithmengesetzen, Stoff ca. 9. Klasse. Du hast also eine Zahl, x*10^309 von mir aus. ln(x*10^309) = ln(x) + ln(10^309) = ln(x) + 309*ln(10). Das kann man wahrscheinlich noch verbessern, Basis 10 ist erstmal nur zur Veranschaulichung. Das hängt auch von deiner Zahlendarstellung ab, double wirds ja nicht sein.
-
Also ich hab eine für mich akzeptable Lösung gefunden, da mir, wie ich gemerkt habe, auch nur der Integer-Anteil ausreicht.
Und da ich das für Python gebraucht habe: hier der Python-Code (mit GNU-GMP für Python).
# log for int, only the integer-part will be returned def ownlog(x,base=math.e): integer = 0 x = mpz(x) # gmpy.mpz fx = mpf(x) # gmpy.mpf while fx > base: integer += 1 fx /= base return integer