Python Arithmetischer Überlauf?

aRkedos

Lt. Commander
Registriert
Nov. 2012
Beiträge
1.236
Hallo zusammen,

ich habe mal eine Verständnisfrage zu den Datentypen in Python.

Die Datentypen müssen in Python ja nicht explizit gesetzt werden (im Gegensatz zu z.B. Java oder VBA). Ist es richtig, dass ich dadurch auch keinen arithmetischen Überlauf produzieren kann?

Also als Beispiel kann ich in Python

Code:
x = 70000

schreiben.

Während in VBA folgendes:
Code:
Dim x As Integer
x = 34000

schon einen Fehler verursacht, da in VBA ein Integer mit vorzeichen ja nur 16 Bit groß ist und dementsprechend nur 2^16 große Werte darstellen kann.

Ist da mein Verständnis richtig, dass dadurch das Python den Datentyp automatisch anpasst ich den Wertebereich eines Datentyps quasi nicht verlassen kann?

Viele grüße
aRkedos
 
Nach meinen Verständnis kann auch bei der dynamischen Typisierung ein Überlauf provoziert werden. Wenn x > int-max, dann wird x zu long. Long hat aber auch nur eine begrenzten Wertebereich.
 
Einfach mal in die Doku schauen? Die ist bei Python eigentlich recht ordentlich.
In python hat ein long laut Doku eine "arbitrary size", kann also beliebig groß werden. Damit das in deinem fall auch klappt, würde ich explicit den type auf long setzen. Ansonsten wird dein beispiel wahrscheinlich als INT eingestuft.

In pythen gibt es meines wissens nach auch keine implizite typumwandlung, nur so als info
 
Ich habe eben mal ein wenig rumgespielt (Python 3 in einem Jupyter Notebook):

Ich habe mit einer Zahl begonnen und die dann in einer Schleife oft multipliziert. Gelegentlich habe ich mir dann die Zahl und ihren Datentyp ausgeben lassen.

Den Integer konnte ich nicht zum überfließen bringen. Bei 12000 Stellen habe ich aufgehört, der Typ war immer noch <class 'int'>
Der Float wurde ab etwa 10^308 zu inf, auch hier ist <class 'float'> geblieben.

Fazit: kann klappen, muss aber nicht.

P.S.: Ich bin mir recht sicher auch schon Probleme mit integer-overflow gehabt zu haben, kann es jetzt aber nicht reproduzieren und bin mir nicht ganz sicher was da los war.
 
Mit
Code:
value = pow(10, 1000000)
print(type(value), value)

erstellst du eine Zahl, welche 1.000.000 Nullen nach der 1 hat. In Python3 ist das immer noch ein Integer.

In Python3 ist der Typ long zu int geworden. Dementsprechend sollte es keinen Überlauf in Python3 geben. Für Python2 kann ich nicht sprechen.
 
Interessant! Das wusste ich garnicht.. dachte ints sind immer 64bit unter Python auf nem 64Bit PC. Das rechtfertigt dann auch, wieso Python bei mir immer so erheblich langsamer als C++ ist.. aber ist ja eigtl. ein cooles Feature einer Skriptsprache.
 
@aRkedos

Python macht das für Dich im Hintergrund. Auch automatische Typanpassungen.

Für numerische Berechnungen verwende das Modul NumPy.
 

Ähnliche Themen

Zurück
Oben