двойной д = 1 / 0,0 против двойной д = 1/0 - PullRequest
3 голосов
/ 10 сентября 2011
double d=1/0.0;
    System.out.println(d);

Он печатает Infinity, но если мы напишем double d=1/0; и напечатаем его, мы получим следующее исключение: Exception in thread "main" java.lang.ArithmeticException: / by zero at D.main(D.java:3) Почему в одном случае Java знает, что погружение на ноль - это бесконечность, но для int0 это не определено?В обоих случаях d является двойным, и в обоих случаях результат равен бесконечности.

Ответы [ 2 ]

14 голосов
/ 10 сентября 2011

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

В вашем коде 1/0 - это целочисленное деление, которое, конечно же, дает сбой. Тем не менее, 1/0.0 является делением с плавающей запятой и поэтому приводит к Infinity.

1 голос
/ 10 сентября 2011

Строго говоря, 1.0/0.0 вовсе не бесконечность, это неопределенное значение.

Как сказал Дэвид в своем ответе, у Float есть способ выразить число, которое находится не в диапазоне от наибольшего числа, которое он может представлять, и от наименьшего.Эти значения известны под общим названием «Не число» или просто NaN.NaN также могут возникать из вычислений, которые действительно бесконечны (например, lim<sub>x -> 0</sub> ln<sup>2</sup> x), значения, которые являются конечными, но могут превышать значения, которые могут представлять значения с плавающей запятой (например, 10 100 100 ).в качестве неопределенных значений, таких как 1 / 0.

Числа с плавающей запятой не совсем четко различают неопределенные значения, переполнение и бесконечность;какая комбинация битов получается в результате этого расчета, зависит.Поскольку просто печатать «NaN» или «Not a Number» немного сложнее для людей, которые не знают, как представлены значения с плавающей запятой, этот форматтер просто печатает «Infinity» или иногда «-Infinity», так как он обеспечивает то же самоеуровень информации, когда вы знаете, что такое FP NaN, и имеет некоторое значение, когда вы этого не делаете.

Целые числа не имеют ничего похожего на NaN с плавающей запятой.Так как нет целого значения для целочисленного значения, когда вы делаете 1/0, остается только вызвать исключение.

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

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