Вывод 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, но никогда не устанавливаете его в число с плавающей точкой, на которое вы фактически собираетесь делить.