Деление двойного числа на ноль в Java

Возможный дубликат:
Почему Java не генерирует исключение при делении на 0,0?

Почему следующий оператор в Java не сообщает об исключении ArithmeticException?

double d = 1.0/0;

person siva636    schedule 25.07.2012    source источник
comment
Потому что это не целочисленное деление.   -  person Mysticial    schedule 25.07.2012
comment
@Mysticial Конечно, но я хочу знать, почему только деление int на ноль приводит к исключению! :-)   -  person siva636    schedule 25.07.2012
comment
Наверное, это вопрос к разработчикам Java. Но это, вероятно, потому, что целочисленное деление на ноль вызовет аппаратное исключение. Но деление на ноль с плавающей запятой просто возвращает INF или NaN.   -  person Mysticial    schedule 25.07.2012
comment
... два значения, которые нельзя выразить в целочисленном поле.   -  person Thilo    schedule 25.07.2012


Ответы (1)


Вкратце: числа с плавающей запятой могут представлять бесконечность (или даже операции, которые дают значения, не являющиеся числами), поэтому операция, которая приводит к этому (например, деление на 0), является допустимой.

Расширяя ответ Мохаммода Хоссейна, а также это вопрос и принятый на него ответ, создается исключение ArithmeticException «Вызывается при возникновении исключительного арифметического условия». Для целых чисел деление на 0 является таким случаем, но для чисел с плавающей запятой (floats и doubles) существуют положительные и отрицательные представления.

Например,

public class DivZeroFun {

    public static void main(String args[]) {

        double f = 5.0;
        System.out.println(f / 0);
        double f2 = -5.0;
        System.out.println(f2/0);
    }
}

Этот код будет печатать «Infinity», а затем «-Infinity» в качестве ответов, потому что «Infinity» на самом деле является допустимым значением для floats и doubles, которое закодировано в Java.

Кроме того, из этого сообщения на форуме :

Представления с плавающей запятой обычно включают + inf, -inf и даже «Not a Number». Целочисленные представления этого не делают. Поведение, которое вы видите, не является уникальным для Java, большинство языков программирования будут делать что-то подобное, потому что это то, что делает оборудование с плавающей запятой (или библиотека низкого уровня).

и снова из сообщения на форуме:

Поскольку используемый стандарт IEEE для чисел с плавающей запятой определяет значения для положительной и отрицательной бесконечности, а также для специального случая «не числа». См. Детали в java.lang.Float и java.lang.Double.

person blahman    schedule 25.07.2012