ArithmeticException, генерируемое в Java
-
23-09-2019 - |
Вопрос
В Java (Number/0) выдает ArithmeticException, в то время как (Number/0.0) = Бесконечность.Почему это происходит?
Решение
Потому что числа с плавающей запятой IEEE-754 имеют представление о бесконечности, в то время как целые числа этого не делают.
Другими словами, каждый битовый шаблон в int
представляет собой обычное целое число;значения с плавающей запятой несколько сложнее с + / - бесконечностью, значениями "не число" (NaN), нормализованными значениями, субнормальными значениями и т.д.
Другие советы
Стандарт IEEE с плавающей запятой, поддерживаемый почти всеми современными процессорами, определяет, что каждая арифметическая операция с плавающей запятой, включая деление на ноль, имеет четко определенный результат.Стандарт поддерживает ноль со знаком, а также бесконечность и NaN (не число).Есть два нуля, +0 (положительный ноль) и -0 (отрицательный ноль), и это устраняет любую двусмысленность при делении.В арифметике IEEE 754 a ÷ +0 означает положительную бесконечность, когда a является положительным, отрицательную бесконечность, когда a является отрицательным, и NaN, когда a = ±0.Вместо этого знаки бесконечности меняются при делении на -0.
Целочисленное деление на ноль обычно обрабатывается иначе, чем с плавающей запятой, поскольку для результата нет целочисленного представления.Некоторые процессоры генерируют исключение при попытке разделить целое число на ноль, хотя другие просто продолжат и сгенерируют неверный результат деления.Результат зависит от того, как реализовано деление, и может быть либо равен нулю, либо иногда максимально возможному целому числу.
Также вы можете проверить JLS, в котором говорится:
15.17.2 Оператор разделения
С другой стороны, если значение делителя при целочисленном делении равно 0, то
генерируется ArithmeticException.
Результат деления с плавающей запятой определяется спецификацией
Арифметики IEEE:Если результат не равен NaN, знак результата положительный, если оба операнда имеют
один и тот же знак, отрицательный, если операнды имеют разные знаки.
Деление ненулевого конечного значения на ноль приводит к бесконечности со знаком.Знак определяется по правилу, изложенному выше.