Slide "Dividing by zero"





  • Aus welchen Gründen gibt der dort Infinity aus und nicht einen Error.
    Jedoch bei Int einen Error.
    Wo ist also der Unterschied bei den Fließkommazahlen und den int literalen?



  • @Weddewer Die Unterstützung von Fließkommazahlen (float, double) richtet sich in Java nach der Spezifikation IEEE 754. Diese Spezifikation legt fest, was bei einer Division durch 0.0 passieren soll.


    Laut der Spezifikation soll das Ergebnis einer Division mit dem Divisor 0.0 (Fließkommazahl) entweder NaN (Not a Number), +Infinity oder -Infinity ergeben:

    • 0.0 / 0.0 = NaN (Dividend muss 0.0 sein)
    • 0.0 / -0.0 = NaN
    • 0.0 / 0 = NaN (Der Divisor 0 ist zwar ein Integer, spielt in diesem Fall jedoch keine Rolle, da der Dividend die Fließkommazahl 0.0 ist)
    • 1.0 / 0.0 = +Infinity
    • 1.0 / -0.0 = -Infinity
    • -1.0 / 0.0 = -Infinity
    • -1.0 / -0.0 = +Infinity

    Bei Fließkommazahlen lassen sich NaN, +Infinity und -Infinity durch folgende spezielle Bitmuster repräsentieren:

    • NaN = 01111111110000000000000000000000, 01111111100000000000000000000001, 11111111110000000000000000000001, …
    • +Infinity = 01111111100000000000000000000000
    • -Infinity = 11111111100000000000000000000000

    Dies lässt sich auch im IEEE-754 Floating Point Converter nachvollziehen.


    IEEE 754 thematisiert jedoch nicht die Division einer ganzen Zahl durch eine weitere ganze Zahl (Integer). Darüber hinaus sind in einem Zweierkomplement-System, wie es für Integer verwendet wird, keine Bits verfügbar, um spezielle Werte wie NaN, +Infinity oder -Infinity zu repräsentieren. Deshalb führt eine solche Rechenoperation zwangsläufig zu einer java.lang.ArithmeticException (bzw. ggf. bereits zuvor zu einem Fehler in der integrierten Entwicklungsumgebung).


Log in to reply