Seite 1 von 1

Kleinste Integer Zahl

Verfasst: Mittwoch 6. Juni 2007, 11:01
von heraklit
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ß

Verfasst: Mittwoch 6. Juni 2007, 11:18
von 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

Verfasst: Mittwoch 6. Juni 2007, 11:54
von EyDu
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

Verfasst: Mittwoch 6. Juni 2007, 16:02
von heraklit
Oh, nette Lösung. Danke schön für eure Antwort
Bastel dir doch einfach deine eigene Unedlichkeit
Klasse Kommentar, LOL :D

Verfasst: Mittwoch 6. Juni 2007, 16:58
von CM
Nachtrag: numpy bringt 'inf' (als float) mit. Ggf. kann man das auch direkt verwenden - je nach Zweck natürlich.

Gruß.
Christian

Verfasst: Mittwoch 6. Juni 2007, 17:46
von veers
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") ;)

Verfasst: Mittwoch 6. Juni 2007, 18:02
von birkenfeld
Funktioniert nur nicht unbedingt überall, da von der C-Runtime abhängig.

Verfasst: Mittwoch 6. Juni 2007, 18:21
von veers
birkenfeld hat geschrieben:Funktioniert nur nicht unbedingt überall, da von der C-Runtime abhängig.
:arrow: Daher unter Windows nicht? ;)

Verfasst: Mittwoch 6. Juni 2007, 18:59
von 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.

Verfasst: Mittwoch 6. Juni 2007, 19:04
von birkenfeld
Das hat mit Windows/!Windows erst mal nichts zu tun, sondern damit, wie und ob die verwendete C-Runtime IEEE 754 implementiert.

Verfasst: Donnerstag 7. Juni 2007, 10:48
von CM
@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

Verfasst: Donnerstag 7. Juni 2007, 13:47
von 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.

Verfasst: Donnerstag 7. Juni 2007, 13:51
von CM
Oh, kapiere. (Manchmal sind ganze Sätze aber schon ein tolles Feature in der zwischenmenschlichen Kommunikation ;-) .)

Verfasst: Donnerstag 7. Juni 2007, 14:02
von mitsuhiko
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