Kleinste Integer Zahl

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
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Hallo,
von C kenne ich, dass es Funktionen gibt, die die kleinste Zahl des Typs integer ausgeben. Gibt es so etwas ähnliches auch in Python. Ich möchte nämlich die Zahl unendlich im Programm modellieren.
Gruß
BlackJack

Du kannst die kleinste Zahl ermitteln die sich mit dem Typ `int()` auf der Architektur darstellen lässt, für die der jeweilige Interpreter übersetzt wurde:

Code: Alles auswählen

In [13]: -sys.maxint - 1
Out[13]: -2147483648

In [14]: -sys.maxint - 42
Out[14]: -2147483689L
Aber wie man sieht ist das nicht die kleinste ganze Zahl die man mit Python vearbeiten kann. Die wird nur durch den Arbeitsspeicher begrenzt.

Falls Du also dieser einen Zahl eine Sonderrolle zuordnen wolltest, dann ist das keine gute Idee weil es eine ganz normale gültige Zahl ist, die dann plötzlich zwei Bedeutungen hat, wobei eine ziemlich "magisch" ist.

Kannst Du auch Fliesskommazahlen verwenden? Da gibt's normalerweise Unendlich als Wert, sowohl positiv als auch negativ. Lässt sich so ermitteln:

Code: Alles auswählen

mul = 1e10
inf = mul
tmp = 0.0
while True:
    inf *= mul
    if inf == tmp:
        break
    tmp = inf
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Bastel dir doch einfach deine eigene Unedlichkeit :-) Du musst du folgende Klasse nur noch um alle deine benötigten Operationen erweitern:

Code: Alles auswählen

class Infinity(object):
	def __init__(self, negative=False):
		self.negative = negative

	def __add__(self, value):
		if isinstance(value, Infinity):
			if self.negative==value.negative:
				return Infinity(self.negative)
			else:
				raise ValueError
		else:
			return Infinity(self.negative)
	__radd__ = __add__

	def __str__(self):
	    if self.negative:
	        return "(-INF)"
	    else:
	        return "INF"
Bentuzen kann man sie danb über:

Code: Alles auswählen

i = Infinity()
print i*10
print 5*i
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Oh, nette Lösung. Danke schön für eure Antwort
Bastel dir doch einfach deine eigene Unedlichkeit
Klasse Kommentar, LOL :D
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Nachtrag: numpy bringt 'inf' (als float) mit. Ggf. kann man das auch direkt verwenden - je nach Zweck natürlich.

Gruß.
Christian
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

CM hat geschrieben:Nachtrag: numpy bringt 'inf' (als float) mit. Ggf. kann man das auch direkt verwenden - je nach Zweck natürlich.

Gruß.
Christian
inf = float("inf") ;)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Funktioniert nur nicht unbedingt überall, da von der C-Runtime abhängig.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

birkenfeld hat geschrieben:Funktioniert nur nicht unbedingt überall, da von der C-Runtime abhängig.
:arrow: Daher unter Windows nicht? ;)
BlackJack

Unter Windows und einem Python das mit dem GCC übersetzt wurde sollte es auch mit 'inf' gehen. Der Microsoft C-Compiler stellt Unendlich als '#Inf' oder so ähnlich dar.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das hat mit Windows/!Windows erst mal nichts zu tun, sondern damit, wie und ob die verwendete C-Runtime IEEE 754 implementiert.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@veers:
veers hat geschrieben:inf = float("inf") ;)
Hä?

Code: Alles auswählen

from numpy import inf
type(inf)
gibt "<type 'float'>".

Also, was ich sagen wollte ist lediglich, daß man u. U. auch das numpy "inf" verwenden kann, je nachdem was man machen will. Ist hier vielleicht nicht opportun, aber vielleicht doch die Info wert. Jedenfalls ist das numpy-inf bereits ein float.

Gruß,
Christian
BlackJack

Und was veers sagen wollte ist, das man das auch ohne `numpy` kann:

Code: Alles auswählen

In [2]: inf = float('inf')

In [3]: inf
Out[3]: inf

In [4]: type(inf)
Out[4]: <type 'float'>
Nur ist eben die Zeichenkettendarstellung von der verwendeten C-Laufzeitbibliothek abhängig und damit nicht portabel.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Oh, kapiere. (Manchmal sind ganze Sätze aber schon ein tolles Feature in der zwischenmenschlichen Kommunikation ;-) .)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

float("inf") geht auf sehr wenigen Platformen. (Beispielsweise gings auf meinem Notebook nicht auf ubuntu warty)

Ich glaub der Platformunabhängigste Weg für inf/NaN ist der hier:

Code: Alles auswählen

inf = 1e10000
nan = inf / inf

def is_nan(x):
    return type(x) is float and x != x

def is_finite(x):
    return x != inf
TUFKAB – the user formerly known as blackbird
Antworten