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

Kleinste Integer Zahl

Beitragvon heraklit » Mittwoch 6. Juni 2007, 11:01

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

Beitragvon BlackJack » Mittwoch 6. Juni 2007, 11:18

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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 6. Juni 2007, 11:54

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

Beitragvon heraklit » Mittwoch 6. Juni 2007, 16:02

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:

Beitragvon CM » Mittwoch 6. Juni 2007, 16:58

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:

Beitragvon veers » Mittwoch 6. Juni 2007, 17:46

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

Beitragvon birkenfeld » Mittwoch 6. Juni 2007, 18:02

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:

Beitragvon veers » Mittwoch 6. Juni 2007, 18:21

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

Beitragvon BlackJack » Mittwoch 6. Juni 2007, 18:59

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

Beitragvon birkenfeld » Mittwoch 6. Juni 2007, 19:04

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:

Beitragvon CM » Donnerstag 7. Juni 2007, 10:48

@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

Beitragvon BlackJack » Donnerstag 7. Juni 2007, 13:47

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:

Beitragvon CM » Donnerstag 7. Juni 2007, 13:51

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

Beitragvon mitsuhiko » Donnerstag 7. Juni 2007, 14:02

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder