Что делает эти три специальных средние значения с плавающей точкой: положительная бесконечность, отрицательная бесконечность, NaN?

Написание интерфейсов «просто потому, что» кажется мне пустой тратой времени и энергии, не говоря уже о нарушении принципа KISS.

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

10
задан mskfisher 10 May 2012 в 13:03
поделиться

5 ответов

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

Положительная бесконечность - это настолько большое положительное число, что его невозможно представить как обычно. Отрицательная бесконечность - это настолько большое отрицательное число, что его невозможно представить нормально. NaN означает «не число» и является результатом математической операции, которая не дает числового деления 0 на 0.

В Java классы Double и Float имеют константы для представления всех трех случаев. Это POSITIVE_INFINITY, NEGATIVE_INFINITY и NaN.

Плюс учтите это:

double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN

Математически все могут видеть, что это 0. Но для машины это «Бесконечность» - «Бесконечность» (того же ранга), что действительно NaN.

11
ответ дан 3 December 2019 в 14:53
поделиться
  • Положительная бесконечность означает стремление к бесконечности в положительном направлении - переход к значениям, которые все больше и больше по величине в положительном направлении.
  • Отрицательная бесконечность означает стремление к бесконечности в отрицательном направлении. - переход к значениям, которые все больше и больше по величине в отрицательном направлении.
  • Не-число (NaN) - это то, что не определено, например результат 0/0 ].

И константы из спецификации класса Float :

Более подробную информацию можно найти в Страница IEEE-754 в Википедии .

Вот небольшая программа для иллюстрации трех констант:

System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);

Вывод:

NaN
Infinity
-Infinity
15
ответ дан 3 December 2019 в 14:53
поделиться
  • 1/0 приведет к положительной бесконечности.
  • 0/0 приведет к Nan. Вы можете использовать NaN как любое другое число, например: NaN + NaN = NaN, NaN + 2.0 = NaN
  • -1/0 приведет к отрицательной бесконечности.

Бесконечность (в java) означает, что результат операции будет настолько большим положительным или отрицательным числом, что его невозможно представить нормально.

3
ответ дан 3 December 2019 в 14:53
поделиться

Вы можете использовать их как любой другой номер:

например:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
0
ответ дан 3 December 2019 в 14:53
поделиться

Идея состоит в том, чтобы представить специальные числа, которые могут возникнуть естественным образом в результате операций с "нормальными" числами. Вы можете рассматривать бесконечность (как положительную, так и отрицательную) как «переполнение» представления с плавающей запятой, идея заключалась в том, что, по крайней мере, в некоторых условиях возвращаемое функцией значение по-прежнему дает значимый результат. У них все еще есть некоторые свойства упорядочивания, например (чтобы они не заваливали операции сортировки, например).

Нан очень конкретен: если x - это Нан, x == x - это ложь (на самом деле это один из способов проверить nan, по крайней мере, в C, снова). Это может сбивать с толку, если вы не привыкли к особенностям операций с плавающей запятой. Если вы не проводите научные вычисления, я бы сказал, что возвращение Nan операцией является ошибкой, по крайней мере, в большинстве случаев, которые приходят на ум. Нан может приходить для различных операций: 0/0, инф - инф, инф / инф, 0 * инф. У Нан также нет свойства упорядочивания.

2
ответ дан 3 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: