it-swarm.com.de

In welchen Kontexten nutzen Programmiersprachen einen Infinity-Wert wirklich?

In Ruby gibt es also einen Trick, um Unendlich anzugeben:

1.0/0
=> Infinity

Ich glaube an Python, dass Sie so etwas tun können

float('inf')

Dies sind jedoch nur Beispiele. Ich bin mir sicher, dass die meisten Sprachen in gewisser Weise unendlich sind. Wann würden Sie dieses Konstrukt tatsächlich in der realen Welt verwenden? Warum ist es besser, es in einem Bereich zu verwenden, als nur einen booleschen Ausdruck zu verwenden? Zum Beispiel

(0..1.0/0).include?(number) == (number >= 0) # True for all values of number
=> true

Zusammenfassend ist das, wonach ich suche, ein realer Grund, Infinity zu verwenden.

EDIT: Ich suche nach echtem Code. Es ist alles gut und schön zu sagen, dass dies der Zeitpunkt ist, an dem man es "benutzen" könnte, wenn Leute es tatsächlich benutzt haben.

27
Chris Lloyd

Der Dijkstra-Algorithmus weist in der Regel Unendlich als anfängliche Kantengewichtung in einem Diagramm zu. Dies ist nicht have "unendlich", sondern nur eine willkürlich konstante Zahl, aber in Java verwende ich normalerweise Double.Infinity. Ich gehe davon aus, dass Ruby ähnlich verwendet werden könnte.

34
mmcdole

Außerhalb des Kopfes kann dies als Anfangswert bei der Suche nach einem Mindestwert nützlich sein.

Zum Beispiel:

min = float('inf')

for x in somelist:
  if x<min: 
    min=x

Was ich bevorzuge, min anfangs auf den ersten Wert von somelist zu setzen

Natürlich sollten Sie in Python in den meisten Fällen nur die integrierte Funktion min () verwenden.

34
Triptych

Es scheint ein implizites "Warum gibt es diese Funktionalität überhaupt?" in deiner frage. Der Grund dafür ist, dass Ruby und Python nur Zugriff auf den gesamten Wertebereich gewähren, den man gemäß IEEE in Gleitkommaform angeben kann.

Diese Seite scheint es gut zu beschreiben: http://steve.hollasch.net/cgindex/coding/ieeefloat.html

Infolgedessen können Sie auch NaN-Werte (Nicht-eine-Zahl) und -0,0 angeben, während Sie für diese Werte möglicherweise auch keine unmittelbare reale Verwendung haben.

17
InfiniteVoid

Bei einigen physikalischen Berechnungen können Sie Unregelmäßigkeiten (dh unendliche Zahlen) derselben Reihenfolge miteinander normalisieren, indem Sie beide aufheben und ein ungefähres Ergebnis erhalten.

Wenn Sie sich mit Grenzen befassen, könnten Berechnungen wie (Unendlich/Unendlich) -> Annäherung an eine endliche Zahl erreicht werden. Es ist nützlich, wenn die Sprache den regulären Fehler der Division durch Null überschreiben kann.

11
Eran Galperin

Verwenden Sie Infinityund -Infinity, wenn Sie einen mathematischen Algorithmus implementieren, der dies erfordert.

In Ruby haben Infinityund -Infinity gute Vergleichseigenschaften, sodass -Infinity <x<Infinityfür jede reelle Zahl xgilt. Zum Beispiel gibt Math.log(0)-Infinity zurück und erweitert die Eigenschaft, die 0 impliziert, auf x > yMath.log(x) > Math.log(y). Außerdem ist Infinity * xInfinityname__, wenn x> 0, -Infinity, wenn x <0 und 'NaN' (keine Zahl, das heißt undefiniert), wenn x 0 ist.

Zum Beispiel verwende ich das folgende Codebit in einem Teil der Berechnung einiger log Likelihood-Verhältnisse . Ich verweise ausdrücklich auf -Infinity, um einen Wert zu definieren, auch wenn k0 oder nist UND x0 oder 1 ist.

Infinity = 1.0/0.0
def Similarity.log_l(k, n, x)
  unless x == 0 or x == 1
    k * Math.log(x.to_f) + (n-k) * Math.log(1.0-x)
  end
    -Infinity
  end
end
10
Bkkbrad

Ich benutze es, um die Masse und Trägheit eines statischen Objekts in physikalischen Simulationen zu spezifizieren. Statische Objekte werden von der Schwerkraft und anderen Simulationskräften im Wesentlichen nicht beeinflusst.

8
Nick Van Brunt
8
pantsgolem

In Ruby Infinity können Lazy-Listen implementiert werden. Angenommen, ich möchte N Zahlen ab 200, die jedes Mal um 100 Einheiten größer werden:

Inf = 1.0 / 0.0
(200..Inf).step(100).take(N)

Weitere Infos hier: http://banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-Ruby/

6
horseyguy

Ich habe es für Fälle verwendet, in denen Sie Präferenzbereiche definieren möchten/erlaubt.

Zum Beispiel haben Sie in 37signals Apps eine Begrenzung der Projektnummer

Infinity = 1 / 0.0
FREE = 0..1
BASIC = 0..5
PREMIUM = 0..Infinity

dann kannst du schecks machen wie

if PREMIUM.include? current_user.projects.count 
 # do something
end
5
ucron

Ich habe es für die Darstellung der Kamera-Fokusentfernung und zu meiner Überraschung in Python verwendet:

>>> float("inf") is float("inf")
False
>>> float("inf") == float("inf")
True

Ich frage mich, warum das so ist.

4
dhill

Ich habe es in einem DSL verwendet, das Rails has_one und has_many ähnelt:

has 0..1 :author
has 0..INFINITY :tags

Dies macht es einfach, Konzepte wie Kleene Star und Plus in Ihrem DSL auszudrücken.

3
James A. Rosen

Ich habe es im Minimax-Algorithmus verwendet . Wenn ich neue Züge generiere und der Min-Spieler auf diesem Knoten gewinnt, ist der Wert des Knotens -∞. Wenn umgekehrt der maximale Spieler gewinnt, ist der Wert dieses Knotens + ∞.

Wenn Sie Knoten-/Spielzustände generieren und dann mehrere Heuristiken ausprobieren, können Sie alle Knotenwerte auf -∞/+ ∞ setzen, je nachdem, was sinnvoll ist. Wenn Sie dann eine Heuristik ausführen, können Sie den Knotenwert einfach festlegen :

node_val = -∞
node_val = max(heuristic1(node), node_val)
node_val = max(heuristic2(node), node_val)
node_val = max(heuristic2(node), node_val)
3
Lolindrath

Ich benutze es, wenn ich ein Range-Objekt habe, bei dem eines oder beide Enden offen sein müssen

2

Ich habe im Umgang mit Bereichsvergleichen symbolische Werte für positive und negative Unendlichkeit verwendet, um Eckfälle zu eliminieren, die ansonsten eine spezielle Behandlung erfordern würden:

Bei zwei gegebenen Bereichen A = [a, b) und C = [c, d) schneiden sie sich, ist einer größer als der andere oder enthält einer den anderen?

A > C iff a >= d
A < C iff b <= c
etc...

Wenn Sie Werte für positive und negative Unendlichkeit haben, die jeweils größer als und kleiner als alle anderen Werte sind, müssen Sie für Bereiche mit offenem Ende keine besondere Behandlung vornehmen. Da Floats und Doubles diese Werte bereits implementieren, können Sie sie auch verwenden, anstatt zu versuchen, die größten/kleinsten Werte auf Ihrer Plattform zu finden. Bei Ganzzahlen ist es schwieriger, "infinity" zu verwenden, da es von der Hardware nicht unterstützt wird.

2
Eclipse

Ich bin darauf gestoßen, weil ich nach einem "unendlichen" Wert suche, um ein Maximum festzulegen, falls ein bestimmter Wert nicht existiert, um einen Binärbaum zu erstellen. (Da ich die Auswahl anhand eines Wertebereichs und nicht nur eines einzelnen Werts vornehme, wurde mir schnell klar, dass selbst ein Hash in meiner Situation nicht funktioniert.)

Da ich erwarte, dass alle beteiligten Zahlen positiv sind, ist das Minimum einfach: 0. Da ich nicht weiß, was für ein Maximum zu erwarten ist, möchte ich, dass die Obergrenze Unendlich ist. Auf diese Weise muss ich nicht herausfinden, mit welchem ​​"Maximum" ich die Dinge vergleichen sollte.

Da dies ein Projekt ist, an dem ich gerade arbeite, handelt es sich technisch gesehen um ein "Problem der realen Welt". Es mag etwas selten sein, aber wie viele Abstraktionen ist es praktisch, wenn Sie es brauchen!

Auch für diejenigen, die sagen, dass dies (und andere Beispiele) erfunden sind, möchte ich darauf hinweisen alles Abstraktionen sind etwas erfunden; Das bedeutet nicht, dass sie nützlich sind, wenn Sie sie erfinden.

2
alpheus

Wenn Sie in einem Problembereich arbeiten, in dem Trig verwendet wird (insbesondere Tangens), kann Unendlich eine Antwort sein. Trig wird häufig in Grafikanwendungen, Spielen und Geodaten sowie in offensichtlichen mathematischen Anwendungen eingesetzt.

1
John Meagher

Es wird ziemlich häufig in Grafiken verwendet. Beispielsweise wird jedes Pixel in einem 3D-Bild, das nicht Teil eines tatsächlichen Objekts ist, als unendlich weit entfernt markiert. Damit kann es später durch ein Hintergrundbild ersetzt werden.

1
Megamug

Ich verwende eine Netzwerkbibliothek, in der Sie die maximale Anzahl von Neuverbindungsversuchen angeben können. Da ich möchte, dass meine Verbindung für immer wieder hergestellt wird:

my_connection = ConnectionLibrary(max_connection_attempts = float('inf'))

Meiner Meinung nach ist es klarer als der typische Stil "Auf -1 setzen, um es für immer zu wiederholen", da er wörtlich "Wiederholen, bis die Anzahl der Verbindungsversuche größer als unendlich ist" lautet.

1
Brendan Long

Ich bin sicher, es gibt andere Möglichkeiten, dies zu tun, aber Sie können Infinity verwenden, um bei einer Konvertierung von String in Float nach sinnvollen Eingaben zu suchen. Zumindest in Java gibt die statische Methode Float.isNaN () für Zahlen mit unendlicher Größe false zurück, was darauf hinweist, dass es sich um gültige Zahlen handelt, obwohl Ihr Programm sie möglicherweise als ungültig einstufen möchte. Das Überprüfen der Konstanten Float.POSITIVE_INFINITY und Float.NEGATIVE_INFINITY löst dieses Problem. Zum Beispiel:

// Some sample values to test our code with
String stringValues[] = {
  "-999999999999999999999999999999999999999999999",
  "12345",
  "999999999999999999999999999999999999999999999"
};

// Loop through each string representation
for (String stringValue : stringValues) {
  // Convert the string representation to a Float representation
  Float floatValue = Float.parseFloat(stringValue);

  System.out.println("String representation: " + stringValue);
  System.out.println("Result of isNaN: " + floatValue.isNaN());

  // Check the result for positive infinity, negative infinity, and
  // "normal" float numbers (within the defined range for Float values).
  if (floatValue == Float.POSITIVE_INFINITY) {
    System.out.println("That number is too big.");
  } else if (floatValue == Float.NEGATIVE_INFINITY) {
    System.out.println("That number is too small.");
  } else {
    System.out.println("That number is jussssst right.");
  }
}

Beispielausgabe:

Zeichenfolgendarstellung: -9999999999999999999999999999999999999999999
Ergebnis von isNaN: false
Diese Zahl ist zu klein.

Zeichenfolgendarstellung: 12345
Ergebnis von isNaN: false
Diese Nummer ist absolut richtig.

Zeichenfolgendarstellung: 9999999999999999999999999999999999999999999
Ergebnis von isNaN: false
Diese Zahl ist zu groß.

1
William Brendel

Wenn Sie die größte Zahl von einer Eingabe wollen, können sie jedoch sehr große Negative verwenden. Wenn ich -13543124321.431 eingebe, funktioniert es immer noch als die größte Zahl, da sie größer als -inf ist.

enter code here
initial_value = float('-inf')
while True:
    try:
        x = input('gimmee a number or type the Word, stop ')
    except KeyboardInterrupt:
        print("we done - by yo command")
        break
    if x == "stop":
        print("we done")
        break
    try:
        x = float(x)
    except ValueError:
        print('not a number')
        continue
    if x > initial_value: initial_value = x
print("The largest number is: " + str(initial_value))
0
cybervigilante

Einige Programmierer verwenden Infinity oder NaNs, um anzuzeigen, dass eine Variable niemals im Programm initialisiert oder zugewiesen wurde.

0
Juan