Различие между бесконечностью и NaN
На предыдущих этапах мы изучили метод Double.isInfinite()
и то, как деление на ноль может привести к бесконечности. Однако в арифметике с плавающей запятой есть еще одно специальное значение, называемое NaN, что означает "Not a Number" (нечисло). NaN представляет результат неопределенной или нерепрезентируемой операции, например, деление нуля на ноль или взятие квадратного корня из отрицательного числа.
Важно уметь различать бесконечные значения и NaN, так как они представляют разные типы исключительных результатов. В Java есть метод Double.isNaN()
, который позволяет проверить, является ли значение типа double
равным NaN.
Последний раз модифицируем нашу программу, чтобы включить вычисление, которое дает NaN, и посмотреть, как отличить его от бесконечности.
-
Откройте файл HelloJava.java
в редакторе WebIDE. Вы должны находиться в директории ~/project
.
-
Замените текущий код следующим:
public class HelloJava {
public static void main(String[] args) {
double positiveInfinity = 10.0 / 0.0;
double nanResult = 0.0 / 0.0;
double finiteNumber = 5.0;
System.out.println("Result of 10.0 / 0.0: " + positiveInfinity);
System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveInfinity));
System.out.println("Is 10.0 / 0.0 NaN? " + Double.isNaN(positiveInfinity));
System.out.println("Result of 0.0 / 0.0: " + nanResult);
System.out.println("Is 0.0 / 0.0 infinite? " + Double.isInfinite(nanResult));
System.out.println("Is 0.0 / 0.0 NaN? " + Double.isNaN(nanResult));
System.out.println("Result of 5.0: " + finiteNumber);
System.out.println("Is 5.0 infinite? " + Double.isInfinite(finiteNumber));
System.out.println("Is 5.0 NaN? " + Double.isNaN(finiteNumber));
}
}
Рассмотрим изменения:
double positiveInfinity = 10.0 / 0.0;
: Мы сохраняем деление, которое дает положительную бесконечность.
double nanResult = 0.0 / 0.0;
: Эта строка выполняет деление нуля на ноль, которое дает NaN.
double finiteNumber = 5.0;
: Обычное конечное число для сравнения.
- Теперь мы добавили вызовы метода
Double.isNaN()
для каждого результата, помимо метода Double.isInfinite()
.
-
Сохраните файл (Ctrl+S или Cmd+S).
-
Скомпилируйте программу в терминале:
javac HelloJava.java
-
Запустите программу:
java HelloJava
Вы должны увидеть вывод, похожий на следующий:
Result of 10.0 / 0.0: Infinity
Is 10.0 / 0.0 infinite? true
Is 10.0 / 0.0 NaN? false
Result of 0.0 / 0.0: NaN
Is 0.0 / 0.0 infinite? false
Is 0.0 / 0.0 NaN? true
Result of 5.0: 5.0
Is 5.0 infinite? false
Is 5.0 NaN? false
Этот вывод четко показывает разницу между бесконечными значениями и NaN. Метод Double.isInfinite()
возвращает true
только для положительной или отрицательной бесконечности, в то время как метод Double.isNaN()
возвращает true
только для NaN. Для конечного числа оба метода возвращают false
. Понимание этого различия является важным для обработки потенциальных ошибок и неожиданных результатов в арифметике с плавающей запятой.