[gelöst] Logarithmus für große Zahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rico
User
Beiträge: 10
Registriert: Samstag 4. November 2006, 13:21
Kontaktdaten:

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.
Zuletzt geändert von rico am Mittwoch 12. September 2007, 23:48, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die GSL bietet auch eine Logarithmus-Funktion an, vielleicht kommst du ja mit PyGSL zu irgendwelchen Ergebnissen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
rico
User
Beiträge: 10
Registriert: Samstag 4. November 2006, 13:21
Kontaktdaten:

@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.
rico
User
Beiträge: 10
Registriert: Samstag 4. November 2006, 13:21
Kontaktdaten:

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
rico
User
Beiträge: 10
Registriert: Samstag 4. November 2006, 13:21
Kontaktdaten:

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.
BlackJack

Auch PyPy wird bei Fliesskommazahlen durch die Hardware beschränkt. Die Beschränkung kommt ja nicht von C sondern von der Fliesskommaeinheit des Prozessors:

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
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.
rico
User
Beiträge: 10
Registriert: Samstag 4. November 2006, 13:21
Kontaktdaten:

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.
Brauche nur math.e, ansonsten sind es ganzzahlige Basen.
Antworten