Search code examples
javafloating-pointdivide-by-zero

Why dividing an integer by zero and type casting it to float results infinity?


I had already searched through different questions on this topic but not get a clear idea. Check this code:

class Test{
    public static void main(String[] s){
        int a=5;
        float b=(float)a/0;
        System.out.print(b);
    }
}

the output is Infinity. But the thing I'm not getting is a is an int and a/0 must throw an exception. So how can it show output Infinity?


Solution

  • The binary / operator performs division, producing the quotient of its operands. The left-hand operand is the dividend and the right-hand operand is the divisor.

    Integer division rounds toward 0. That is, the quotient produced for operands n and d that are integers after binary numeric promotion (§5.6.2) is an integer value q whose magnitude is as large as possible while satisfying |d·q||n|; moreover, q is positive when |n||d| and n and d have the same sign, but q is negative when |n||d| and n and d have opposite signs. There is one special case that does not satisfy this rule: if the dividend is the negative integer of largest possible magnitude for its type, and the divisor is -1, then integer overflow occurs and the result is equal to the dividend. Despite the overflow, no exception is thrown in this case. On the other hand, if the value of the divisor in an integer division is 0, then an ArithmeticException is thrown.

    The result of a floating-point division is determined by the specification of IEEE arithmetic:

    If either operand is NaN, the result is NaN.
    If the result is not NaN, the sign of the result is positive if both operands have the same sign, negative if the operands have different signs.
    Division of an infinity by an infinity results in NaN.
    Division of an infinity by a finite value results in a signed infinity. The sign is determined by the rule stated above.
    Division of a finite value by an infinity results in a signed zero. The sign is determined by the rule stated above.
    Division of a zero by a zero results in NaN; division of zero by any other finite value results in a signed zero. The sign is determined by the rule stated above.
    Division of a nonzero finite value by a zero results in a signed infinity. The sign is determined by the rule stated above.
    In the remaining cases, where neither an infinity nor NaN is involved, the exact mathematical quotient is computed. A floating-point value set is then chosen:
        If the division expression is FP-strict (§15.4):
            If the type of the division expression is float, then the float value set must be chosen.
            If the type of the division expression is double, then the double value set must be chosen. 
        If the division expression is not FP-strict:
            If the type of the division expression is float, then either the float value set or the float-extended-exponent value set may be chosen, at the whim of the implementation.
            If the type of the division expression is double, then either the double value set or the double-extended-exponent value set may be chosen, at the whim of the implementation. 
    
    Next, a value must be chosen from the chosen value set to represent the quotient. If the magnitude of the quotient is too large to represent, we say the operation overflows; the result is then an infinity of appropriate sign. Otherwise, the quotient is rounded to the nearest value in the chosen value set using IEEE 754 round-to-nearest mode. The Java programming language requires support of gradual underflow as defined by IEEE 754 (§4.2.4). 
    

    Despite the fact that overflow, underflow, division by zero, or loss of information may occur, evaluation of a floating-point division operator / never throws a run-time exception.

    This can be verified at: http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.17.2