Wie werden Zahlen > 32 bzw 64 bit behandelt?

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
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Meine Frage ist, wie Python mit Zahlen umgeht, die zu groß für die Wortbreite der Prozessorarchitektur sind.
Mich interessiert unter anderem, wie viel Geschwindigkeitseinbußen man so grob erwarten kann. Wie werden die Zahlen abgespeichert und dann verarbeitet (Datenstruktur)? Wie sieht es bei Float aus?


Wenn jemand erklären will, wie es im allgemeinen von Programmiersprachen/Compilern gehandhabt wird (zB in C), würde ich das auch gerne hören :)
BlackJack

@Nocta: Schau doch in den Quelltext. So allgemein kann man die Frage auch nicht beantworten, das das nicht nur von der Python-Implementierung abhängt (CPython, PyPy, Jython, …) sondern auch innerhalb einer Implementierung von der Version.

Der Typ `float` ist zumindest bei CPython ein C-``double``.

Allgemein wird das von Programmiersprachen und Compilern unterschiedlich gehandhabt. Wenn der Prozessor den Wertebereich eines Zahltyps nicht unterstützt, dann gibt es Code in der Laufzeitbibliothek um mit den Zahlen zu operieren. Und Prozessoren sind da ja sehr verschieden in den Wertebereichen und was sie so können. Auf den üblichen PCs gibt's heute mindestens 64-Bit-Register und Maschinensprachebefehle zur Division, wogegen viele Mikroprozessoren 8-Bit-Register haben und der Prozessor nicht mal ”nativ” multiplizieren kann.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Nocta: http://hg.python.org/cpython/file/e6dce ... ngobject.c

Generelles Vorgehen: http://en.wikipedia.org/wiki/Arbitrary- ... arithmetic

Die BigNum-Libs arbeiten idR nach dem Schema, dass die Überbreite in einem Array von Registerzuständen abgebildet wird (Basis 2), und die Grundoperationen so implementiert werden, dass sie sequentiell unter Beachtung der Überträge das Array "durchrechnen". Laufzeitangaben sind schwierig, da es im Einzelfall von auftretenden Überträgen oder auch von der Operation selbst abhängt, hinzu kommt immer ein Faktor O(Arraygröße) + Speicherzugriffe. Z.B. ist die optimale Multiplikation nach wie vor ungelöst, vermutet wird O(n*log(n)). Triviale Multiplikation machts in O(n^2). Die bekannten besseren Multiplikationalorithmen lohnen erst ab sehr vielen Stellen.
Antworten