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

Как мы можем использовать их в наших кодах и что вызовет NaN (а не число)?


person Johanna    schedule 17.06.2009    source источник


Ответы (6)


Это может быть хорошим справочником, если вы хотите узнать больше о числах с плавающей запятой в 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.

person Cameron    schedule 17.06.2009
comment
Я попытался исправить неработающую ссылку, но она была отклонена. Вот действительно хороший ресурс, который также включает раздел контроля качества со ссылками для дальнейшего изучения. . - person Michael Hogenson; 12.07.2013
comment
Я не согласен с характеристикой (здесь и в других местах), что положительная бесконечность - это число настолько большое, что его нельзя представить нормально. Это может быть настолько большое число, что оно не может быть представлено как обычное число с плавающей запятой, но на практике оно обычно происходит от чего-то вроде 5f / 0f, что не является большим (реальным) числом; это наивная версия бесконечности. (Технически + inf, -inf и NaN являются расширениями вещественных чисел, которые обеспечивают закрытие любой арифметической операции, но за счет нарушения основных аксиом поля. Это не имеет большого значения для компьютерных ученых, это имеет значение для математиков). - person Peter Webb; 14.08.2013
comment
@PeterWebb: Тот факт, что NaN, к сожалению, был определен не только как нерейтинговый, но и как неравный самому себе, означает, что float и double не только нарушают аксиомы поля - они даже не являются классами эквивалентности. Это интересует гораздо больше людей, чем просто математиков, поскольку заставляет использовать уродливые клуджи для работы коллекций. - person supercat; 16.04.2014
comment
@PeterWebb на самом деле, даже без ± inf / NaN float, double и т.д. нарушают аксиомы поля, а именно ассоциативность. В любом случае, они не должны быть основными строительными блоками для математиков, которые хотят работать с истинными действительными числами - для них существуют системы компьютерной алгебры, которые могут работать с точными числами. - person Ruslan; 02.02.2017

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

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

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

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

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

Вывод:

NaN
Infinity
-Infinity
person coobird    schedule 17.06.2009
comment
но я думаю, что 1/0 вызовет положительную бесконечность: -? - person Johanna; 17.06.2009
comment
Да, вы правы - это была моя ошибка, и она исправлена. - person coobird; 17.06.2009

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

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

person kadam    schedule 17.06.2009

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

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

person David Cournapeau    schedule 17.06.2009

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

e.g:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
person Freddy    schedule 17.06.2009

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

это неполный ответ (или недостаточно проясненный) - учтите это:

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

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

person Alex    schedule 30.03.2016
comment
Если цитируете ответ, его обычно лучше оставить в виде комментария или предложения отредактировать. Ответы должны быть самостоятельными. - person chrisbajorin; 30.03.2016
comment
хорошо, я не знал, что могу редактировать другие сообщения ... это как мерзавец :) - person Alex; 30.03.2016