Ich bin grad auf der Suche nach einem Algo, der den nat. Logarithums (bzw. variable Basis) von großen Zahlen berechnet.
Bin bei meiner Suche auf diese Seite gestoßen, allerdings wird die Funktion bei 1e309 extrem langsam und math.log steigt bei 1e309 mit einem "OverflowError: math range error" aus.
[gelöst] Logarithmus für große Zahlen
Zuletzt geändert von rico am Mittwoch 12. September 2007, 23:48, insgesamt 1-mal geändert.
@Leonidas: danke für den Tipp, aber da es dafür kein deb-Paket gibt und ich nicht unbedingt aus sourcen installieren will, muss ich doch noch ein bisschen weiter suchen. Hab auch so halb was gefunden, allerdings muss ich noch sehen, wie ich das umsetzen kann.
So, hab eine für mich akzeptable Lösung gefunden, da mir auch nur der Integer-Anteil vom Ergebnis ausreicht. Darum hab ich einen Teil aus dem Code genommen, den ich auf der oben bereits erwähnten Seite gefunden habe.
Code: Alles auswählen
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
Hoi,
Ich möchte nur fragen, weil ich einige Dinge verwirrend finde und hoffe ihr könnt mir ggf. erklären wo ich meinen Denkfehler mache:
Wenn die Logfunktionen aussteigen, weil 1e309==inf ist, dann sind die Fehlermeldungen von math.log, cmath.log und das ewige (!) Iterieren von logN zwar logisch, aber es gibt zwei Dinge, die ich nicht verstehe:
(Vorweg natürlich: Ist 1e309 bei Dir inf?)
- Wieso braucht logN eine endliche Zeit? Das dürfte niemals ein Ergebnis ausspucken.
- Wieso ergibt Deine Funktion etwas Sinnvolles?
Wenn 1e309!=inf (also tatsächlich eine Zahl ist), dann sollten auch math.log und cmath.log funktionieren - und zwar schnell.
Gruß,
Christian
Ich möchte nur fragen, weil ich einige Dinge verwirrend finde und hoffe ihr könnt mir ggf. erklären wo ich meinen Denkfehler mache:
Wenn die Logfunktionen aussteigen, weil 1e309==inf ist, dann sind die Fehlermeldungen von math.log, cmath.log und das ewige (!) Iterieren von logN zwar logisch, aber es gibt zwei Dinge, die ich nicht verstehe:
(Vorweg natürlich: Ist 1e309 bei Dir inf?)
- Wieso braucht logN eine endliche Zeit? Das dürfte niemals ein Ergebnis ausspucken.
- Wieso ergibt Deine Funktion etwas Sinnvolles?
Wenn 1e309!=inf (also tatsächlich eine Zahl ist), dann sollten auch math.log und cmath.log funktionieren - und zwar schnell.
Gruß,
Christian
Ich habe eben ein wenig rumprobiert und was herausgefunden.
Da Python ja in C geschrieben ist, sind folglich auch math&Co in C geschrieben und der Datentyp 'double' in C steigt nunmal bei 1e309 aus.
Hinweis: PyPy! Da Python in Python neu geschrieben wurde, gibt es da keine Beschränkung, also lässt sich selbst math.log(1e1000) ganz einfach und schnell berechnen.
Da Python ja in C geschrieben ist, sind folglich auch math&Co in C geschrieben und der Datentyp 'double' in C steigt nunmal bei 1e309 aus.
Hinweis: PyPy! Da Python in Python neu geschrieben wurde, gibt es da keine Beschränkung, also lässt sich selbst math.log(1e1000) ganz einfach und schnell berechnen.
Auch PyPy wird bei Fliesskommazahlen durch die Hardware beschränkt. Die Beschränkung kommt ja nicht von C sondern von der Fliesskommaeinheit des Prozessors:
Sind die Basen die Du brauchst wirklich Fliesskommazahlen oder tun es auch ganzzahlige Basen? Dann liesse sich der Code auch ausschliesslich mit ganzen Zahlen schreiben.
Code: Alles auswählen
Python 2.4.1 (pypy 1.0.0 build 43187) on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> import math
>>>> math.log(1e1000)
Traceback (most recent call last):
File "<console>", line 1, in <interactive>
OverflowError: math range error
Brauche nur math.e, ansonsten sind es ganzzahlige Basen.BlackJack hat geschrieben:Sind die Basen die Du brauchst wirklich Fliesskommazahlen oder tun es auch ganzzahlige Basen? Dann liesse sich der Code auch ausschliesslich mit ganzen Zahlen schreiben.