ArithmeticException выдается в Java - PullRequest
       13

ArithmeticException выдается в Java

6 голосов
/ 27 января 2010

В Java (Number / 0) создает исключение ArithmeticException, а (Number / 0.0) = Бесконечность. Почему это происходит?

Ответы [ 3 ]

13 голосов
/ 27 января 2010

Поскольку числа с плавающей запятой IEEE-754 имеют представление для бесконечности, а целые числа - нет.

Другими словами, каждый битовый шаблон в int представляет нормальное целое число; Значения с плавающей запятой гораздо сложнее с +/- бесконечностью, значениями «не число» (NaN), нормализованными значениями, субнормальными значениями и т. д.

3 голосов
/ 27 января 2010

Отсюда

Стандарт IEEE с плавающей точкой, поддерживаемый почти всеми современными процессорами, определяет, что каждая арифметическая операция с плавающей точкой, включая деление на ноль, имеет четко определенный результат. Стандарт поддерживает ноль со знаком, а также бесконечность и NaN (не число). Есть два нуля, +0 (положительный ноль) и -0 (отрицательный ноль), и это устраняет любую неопределенность при делении. В арифметике IEEE 754 a ÷ + 0 - это положительная бесконечность, когда a положительная, отрицательная бесконечность, когда a отрицательная, и NaN, когда a = ± 0. Вместо этого знаки бесконечности изменяются при делении на -0.

Целочисленное деление на ноль обычно обрабатывается иначе, чем с плавающей запятой, поскольку для результата нет целочисленного представления. Некоторые процессоры генерируют исключение, когда делается попытка разделить целое число на ноль, хотя другие просто продолжат и сгенерируют неверный результат для деления. Результат зависит от того, как реализовано деление, и может быть либо нулем, либо иногда наибольшим возможным целым числом.

0 голосов
/ 27 января 2010

Также вы можете проверить JLS, который говорит:

15.17.2 Оператор деления
С другой стороны, если значение делителя в целочисленном делении равно 0, то исключение ArithmeticException.

Результат деления с плавающей запятой определяется спецификацией IEEE арифметика: Если результат не NaN, знак результата будет положительным, если оба операнда имеют один и тот же знак, отрицательный, если операнды имеют разные знаки.
Деление ненулевого конечного значения на ноль приводит к бесконечности со знаком. Знак определяется по правилу, указанному выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...