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:
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

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.

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ä?
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