Вывод Java дает мне "Бесконечность"

Вывод для Java-программы, которую я написал, дает мне "Бесконечность", когда я должен получить число. Я использую поплавки, и я не думаю, что мои числа выходят за пределы диапазона возможностей поплавков.

Мой вопрос заключается в том, получу ли я когда-нибудь "Бесконечность" в качестве выходных данных, если Java вычислит значение, которое больше, чем может обрабатывать используемый тип данных? Или "Бесконечность" возвращается, только если я случайно где-то делился на ноль.

3 ответа

Решение

JLS отвечает на это довольно явно.

Переполнение операции с плавающей точкой создает бесконечность со знаком.

Возможно, вы где-то делитесь на ноль, но вы можете проверить.

double b = 1.1*Double.MAX_VALUE;
System.out.println(b);

Это проявляется как бесконечность.

Пожалуйста, обратитесь к ответу Dayofcondor здесь: Каковы на самом деле константы INFINITY в Java?

Когда ваши операции выходят за пределы диапазона с плавающей точкой, вы по умолчанию получаете бесконечность. Однако, как вы сказали, бесконечность обычно начинается где-то с нулевого деления или с циклической (или слишком большой операции). Если вы разместите фрагмент своего кода, я могу дать вам подсказку о том, где он "незащищен".

   Operation            Result
n ÷ ± Infinity           0
±Infinity × ±Infinity   ±Infinity
±nonzero  ÷ 0           ±Infinity
Infinity  + Infinity    Infinity
±0 ÷ ±0                 NaN
Infinity - Infinity     NaN
±Infinity ÷ ±Infinity   NaN
±Infinity × 0           NaN

Да, в соответствии с этим: максимальное значение для Float в Java? максимальное значение, которое может иметь float, равно Float.MAX_VALUE.

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

Есть класс с именем StackTraceElement, который предоставляется классом Thread. Вы можете использовать это, чтобы увидеть, какой класс / номер строки.

https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html https://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html

Скажем, у вас есть что-то вроде этого:

float result = A / B;

Каждый раз, когда вы видите что-то подобное, вы можете использовать это простое выражение для печати:

float result = A / B;
System.out.format("Divisor: %d, Dividend: %d, result: %d", A, B, result);
// alternatively, add in the stack trace stuff.

Когда вы найдете виновника, причина, вероятно, довольно очевидна. Я думаю, что вы можете инициализировать это значение "B" равным 0, но никогда не устанавливаете его в число с плавающей точкой, на которое вы фактически собираетесь делить.

Другие вопросы по тегам