Warum ist infinity = 0x3f3f3f3f?

In einigen Situationen, man verwendet in der Regel einen ausreichend großen integer-Wert ein, der für die Unendlichkeit. Ich verwende in der Regel die größte Darstellbare positive/negative ganze Zahl ist. Das liefert meist mehr code, da Sie brauchen, um zu überprüfen, ob einer der Operanden infinity, bevor praktisch alle arithmetischen Operationen, um überläufe zu vermeiden. Manchmal wäre es wünschenswert, gesättigten integer-Arithmetik. Aus diesem Grund, einige Leute verwenden Sie kleinere Werte für unendlich, Hinzugefügt werden können oder multipliziert mehrmals ohne überlauf. Was mich fasziniert, ist die Tatsache, dass es extrem Häufig zu sehen (speziell in der Programmierung Wettbewerben):

const int INF = 0x3f3f3f3f;

Warum ist diese Zahl besonders? Es ist binäre Darstellung:

00111111001111110011111100111111

Sehe ich keine besonders interessante Eigenschaft hier. Ich sehe es leicht zu geben, aber wenn das der Grund war, die fast alles tun würde (0x3e3e3e3e, 0x2f2f2f2f, etc). Es kann Hinzugefügt werden, einmal ohne überlauf, wodurch für:

a = min(INF, b + c);

Aber auch alle anderen Konstanten tun würde, dann. Googeln zeigt nur mir eine Menge code-snippets verwenden, die Konstante, aber keine Erklärungen oder Kommentare.

Kann jeder es sehen?

  • Hast du irgendein konkretes Beispiel verwendet werden in einem generischen Kontext (und nicht in einem speziellen Algorithmus, wo es sinnvoll ist)?
  • Ich getaggt dies als C, da eine schnelle Google-Suche findet man nur C-code verwendet, der Konstante. Fühlen Sie sich frei, um neues Tag zuzuordnen.
  • Zum Beispiel, nehmen Sie einen Algorithmus, der berechnet die kürzesten Wege in einem Graphen. Der Abstand zu den nicht-erreichbar-vertices aus der starting vertex ist theoretisch unendlich. Benötigen Sie eine Möglichkeit, Sie zu vertreten (aber mit floating-point wäre ein overkill). Es könnte sein Beispiele für sehr unterschiedliche algorithmen, die diesen verwenden. Ich gab ein konkretes Beispiel, aber die Technik ist praktisch, wenn Sie schreiben würde "infinity" in pseudocode.
  • Die spezifischen Beispiele, nicht "dies könnte hypothetisch verwendet werden". Sie behaupten, dass diese sind extrem Häufig, bitte link, um einige Reale Beispiele.
  • Sorry, ich glaube, meine Behauptung war in der Tat zu stark. Dies kann gelegentlich in der "realen Welt", aber Sie sind immer noch "sehr Häufig" in der Programmierung Wettbewerbe: goo.gl/PMCUNL
InformationsquelleAutor Gabriel | 2013-08-25
Schreibe einen Kommentar