/ / Nach einem kanonischen Beispiel für dieses Überlaufproblem suchen - c, Überlauf

Suchen Sie nach einem kanonischen Beispiel für dieses Überlaufproblem - c, overflow

Dies kam vor kurzem in einem Interview auf (das Konzept) und ich war es mit einem Freund heute diskutieren. Hier ist die Idee:

Angenommen, Sie berechnen das Punktprodukt eines dreidimensionalen Vektors. Eine einfache Funktion wäre "return (x1 * x2) + (y1 * y2) + (z1 * z2)".

Wenn jedoch der erste und der zweite Begriff groß sindBei positiven Zahlen könnten sie überlaufen, auch wenn sie innerhalb des akzeptablen Bereichs liegen. Angenommen, die Ganzzahlgrenze liegt bei 128. 100 + 100 - 80 = 120, aber wenn Sie die ersten beiden Ergänzungen zuerst ausführen, werden Sie überlaufen.

In einer Universitätsklasse ging es um ein CEin Auftrag, bei dem wir etwas berechnet hatten, das wir wahrscheinlich schon tausendmal gemacht hatten, aber nie auf Überlauf geachtet hatte (dies war der Teil, in dem wir über das Schreiben von Sanitärcode lernten), wie einen Durchschnitt oder etwas Ähnliches.

Hat jemand eine Idee, in welchem ​​Zusammenhang dies geschehen könnte? Ich weiß, es war eine Situation, in der Sie vor oder anstelle der Addition / Subtraktion Vergleiche verwenden mussten, um diesen Überlauf zu vermeiden

Antworten:

3 für die Antwort № 1

Die binäre Suche ist ein klassisches Beispiel. Viele Implementierungen führen eine Berechnung durch, die im Grunde den Mittelpunkt zweier Indizes findet: (hoch + niedrig) / 2 Wenn sich high und low jedoch jeweils in der Nähe von Integer.MAX_VALUE oder dem Äquivalent für Ihre Sprache befinden, kann es vor dem Divide zu hohen + low-Überläufen kommen, und Ihre Antwort ist falsch:

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Einfache Lösung ist in diesem Fall zu tun: hoch / 2 + niedrig / 2 Stattdessen läuft das zwar nicht über, aber es ist ein fast universeller Fehler bei Implementierungen der binären Suche, und es ist das erste, was einem einfällt, wenn jemand von einem Überlauf in einer Berechnung spricht, der zu einem Nichtüberlauf führen sollte Wert.