Как мы можем использовать их в наших кодах и что вызовет NaN (а не число)?
Что означают эти три специальных значения с плавающей запятой: положительная бесконечность, отрицательная бесконечность, NaN?
Ответы (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.
float
и double
не только нарушают аксиомы поля - они даже не являются классами эквивалентности. Это интересует гораздо больше людей, чем просто математиков, поскольку заставляет использовать уродливые клуджи для работы коллекций.
- person supercat; 16.04.2014
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
- 1/0 приведет к положительной бесконечности.
- 0/0 приведет к Nan. Вы можете использовать NaN как любое другое число, например: NaN + NaN = NaN, NaN + 2.0 = NaN.
- -1/0 приведет к отрицательной бесконечности.
Бесконечность (в java) означает, что результатом операции будет такое чрезвычайно большое положительное или отрицательное число, что оно не может быть представлено нормально.
Идея состоит в том, чтобы представить специальные числа, которые могут возникнуть естественным образом в результате операций с «нормальными» числами. Вы можете рассматривать бесконечность (как положительную, так и отрицательную) как «переполнение» представления с плавающей запятой, идея заключалась в том, что, по крайней мере, в некоторых условиях получение такого значения, возвращаемого функцией, по-прежнему дает значимый результат. Например, у них все еще есть некоторые свойства упорядочивания (например, они не будут винить операции сортировки).
Nan очень конкретен: если x - это Nan, x == x - false (это фактически один из способов проверить nan, по крайней мере, в C, снова). Это может сбивать с толку, если вы не привыкли к особенностям операций с плавающей запятой. Если вы не проводите научные вычисления, я бы сказал, что возвращение Nan операцией является ошибкой, по крайней мере, в большинстве случаев, которые приходят на ум. Нан может приходить для различных операций: 0/0, инф - инф, инф / инф, 0 * инф. У Нан также нет свойства упорядочивания.
Вы можете использовать их как любой другой номер:
e.g:
float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
Положительная бесконечность - это настолько большое положительное число, что его невозможно представить нормально. Отрицательная бесконечность - это настолько большое отрицательное число, что его невозможно представить нормально. NaN означает «не число» и является результатом математической операции, которая не дает числа - например, деления 0 на 0.
это неполный ответ (или недостаточно проясненный) - учтите это:
double a = Math.pow(10,600) - Math.pow(10,600); //==NaN
математически каждый может видеть, что это 0. но для машины это "Бесконечность" - ведьма "Бесконечность" (того же порядка) действительно NaN ...