Warum führt eine ganzzahlige Division durch Null zu einer Gleitkomma-Ausnahme?

Lesezeit: 2 Minuten

Die Division durch Null in einem C-Programm führt zu einem abnormalen Abbruch mit der Fehlermeldung Floating point exception (core dumped). Dies ist bei einer Gleitkommadivision nicht überraschend, aber warum wird dies gesagt, wenn eine ganzzahlige Division durch Null auftritt? Verwendet die Integer-Division tatsächlich die FPU unter der Haube?

(Das ist übrigens alles unter Linux unter x86.)

  • Es ist erwähnenswert, dass andere Nicht-POSIX-Betriebssysteme (z. B. Windows) und die x86-Hardware unterschiedliche Ausnahmen für Integer- und Fließkomma-Teilung durch Null melden.

    – Absturz

    3. Juni 2016 um 0:41 Uhr

  • Verwandte Themen: Auf welchen Plattformen löst eine Ganzzahl-Division durch Null eine Fließkomma-Ausnahme aus?. TL:DR: POSIX verlangt, dass es SIGFPE ist, wenn überhaupt ein Signal vorhanden ist.

    – Peter Cordes

    23. September 2017 um 12:17 Uhr

Benutzer-Avatar
Oliver Charlesworth

Verwendet die Integer-Division tatsächlich die FPU unter der Haube?

Nein, Linux generiert auch in diesem Fall nur SIGFPE (es ist ein Legacy-Name, dessen Verwendung jetzt erweitert wurde). In der Tat die Single Unix Specification definiert SIGFPE wie “Fehlerhafte arithmetische Operation“.

man signal erwähnt:

Die ganzzahlige Division durch Null hat ein undefiniertes Ergebnis. Auf einigen Architekturen wird ein SIGFPE-Signal generiert. (Auch das Teilen der negativsten ganzen Zahl durch -1 kann SIGFPE erzeugen.)

Meine Vermutung einer historischen Erklärung dafür wäre, dass die ursprüngliche Unix-Hardware keinen Trap bei der Integer-Division durch Null erzeugt hat, so der Name SIGFPE machte Sinn. (PDP-Assembler-Programmierer, bestätigen?) Später, als das System auf Hardware mit einer ganzzahligen Division-durch-Null-Falle portiert (oder im Fall von Linux neu implementiert) wurde, wurde es nicht als sinnvoll erachtet, eine neue Signalnummer hinzuzufügen, also der alte bekam eine neue Bedeutung und hat jetzt einen etwas verwirrenden Namen.

  • Sie scheinen recht zu haben: gem diese Referenz, DIV Anweisung setzt einfach C und V Flags bei Division durch Null und V Flag nur, wenn das Ergebnis nicht in das Zielregister passt. OTOH, gem diese Seite FP11 – die neuere FPU des PDP-11 – unterstützt Trapping. Es bestand also ursprünglich kein Bedarf für einen ganzzahligen Divisionsfehlersignalnamen.

    – Ruslan

    30. März 2018 um 21:22 Uhr


Dafür kann es viele verschiedene implementierungsspezifische Gründe geben.

Beispielsweise unterstützt die FPU-Einheit auf der x86-Plattform sowohl Fließkomma- als auch Integer-Formate zum Lesen von Argumenten und Schreiben von Ergebnissen. Damals, als die Plattform selbst 16-Bit war, verwendeten einige Compiler die FPU, um Divisionen mit 32-Bit-Integer-Operanden durchzuführen (da es keinen Genauigkeitsverlust für 32-Bit breite Daten gibt). Unter solchen Umständen wäre es nichts Ungewöhnliches, einen echten FPU-Fehler für eine ungültige 32-Bit-Integer-Division zu erhalten.

1129260cookie-checkWarum führt eine ganzzahlige Division durch Null zu einer Gleitkomma-Ausnahme?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy