Wie kann man feststellen, ob es einen Überlauf gibt?



  • Hallo, ich versuche grade eine Klasse für die saturierende Arithmetik zu erstellen. Die Maxima und Minima sollten dabei die von byte, short, int und long sein. Nur wie überprüft man, ob es einen überlauf gibt?

    Meine Idee wäre es einfach z.B. bei der Addition immer eine Eins zu addieren und zu kucken, ob das Maximum erreicht wurde usw.. Aber gibt es nicht auch andere wege?



  • Bei einer Addition a + b mit b > 0 wird ein Überlauf passieren, wenn MAX - b < a. Bei einer Subtraktion a - b mit b > 0 wird ein Unterlauf passieren, wenn MIN + b > a. Die Fälle mit b < 0 ergeben sich aus a + b = a - (-b) bzw. a - b = a + (-b).

    Für Multiplikation ist das etwas komplizierter, für Division stellt sich die Frage nur im Fall MIN / -1 (weil's halt Integer sind; Zweierkomplementdarstellung vorausgesetzt). Jemand hat hier eine Lösung angeboten -- zwar nur für uint64_t, aber die lässt sich verallgemeinern. Mit den Vorzeichen muss man etwas rangieren, aber das ist dann nur Fleißarbeit.



  • MIN / -1 ergibt doch MAX ?



  • Nein, MIN / -1 == MAX + 1 in der Zweierkomplementdarstellung.



  • wxSkip schrieb:

    Nein, MIN / -1 == MAX + 1 in der Zweierkomplementdarstellung.

    Ja schon, aber bei der saturierenden Arithmetik ist das dann doch wegen des Überlaufs das Maximum oder nicht?



  • Wieso gibt es eigentlich in der Standardbibliothek keine Funktion dafür? Die könnte dann auch so gestaltet werden, dass sie die Prozessorregister benutzt, anstatt zu rechnen, falls möglich.
    Wobei die Umsetzung natürlich vielleicht nicht ganz leicht ist, wie mir gerade auffiel, denn die Register werden ja erst im Nachhinein gesetzt, normalerweise schaut man aber vor der Rechnung, ob sich ein Überlauf ereignen wird. Hm …
    Ich stell’s einfach trotzdem mal zur Diskussion. 😉



  • In der Sättigungsarithmetik schon, aber die willst du ja erst implementieren. Bei der Über- bzw. Unterlaufsprüfung musst du MIN / -1 also abhandeln.

    Dass es in der Standardbibliothek keine Funktionen (bzw. sinnvollerweise wohl Typen) dafür gibt, wird mit mangelnder Nachfrage zusammenhängen.



  • Darüber wird bereits diskutiert, ist aber leider keine Priorität. C++14 könnte es nur noch als last-minute Einschub erreichen.



  • Hat sich erledigt, jetzt weiß ich, dass so große Zahlen nicht in dezimaldarstellung übergeben werden sollen.


Anmelden zum Antworten