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ß
Kleinste Integer Zahl
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:
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
In [13]: -sys.maxint - 1
Out[13]: -2147483648
In [14]: -sys.maxint - 42
Out[14]: -2147483689L
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
Bastel dir doch einfach deine eigene Unedlichkeit Du musst du folgende Klasse nur noch um alle deine benötigten Operationen erweitern:
Bentuzen kann man sie danb über:
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"
Code: Alles auswählen
i = Infinity()
print i*10
print 5*i
Nachtrag: numpy bringt 'inf' (als float) mit. Ggf. kann man das auch direkt verwenden - je nach Zweck natürlich.
Gruß.
Christian
Gruß.
Christian
- 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.
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.
- 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.
@veers:
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
Hä?veers hat geschrieben:inf = float("inf")
Code: Alles auswählen
from numpy import inf
type(inf)
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
Und was veers sagen wollte ist, das man das auch ohne `numpy` kann:
Nur ist eben die Zeichenkettendarstellung von der verwendeten C-Laufzeitbibliothek abhängig und damit nicht portabel.
Code: Alles auswählen
In [2]: inf = float('inf')
In [3]: inf
Out[3]: inf
In [4]: type(inf)
Out[4]: <type 'float'>
Oh, kapiere. (Manchmal sind ganze Sätze aber schon ein tolles Feature in der zwischenmenschlichen Kommunikation .)
-
- 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:
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