Что означают эти три значения с плавающей запятой: положительная бесконечность, отрицательная бесконечность, NaN? - PullRequest
10 голосов
/ 17 июня 2009

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

Ответы [ 6 ]

15 голосов
/ 17 июня 2009
  • Положительная бесконечность означает переход к бесконечности в положительном направлении - переход к значениям, которые все больше и больше по величине в положительном направлении.
  • Отрицательная бесконечность означает переход к бесконечности в отрицательном направлении - переход к значениям, которые все больше и больше в отрицательном направлении.
  • Not-a-number (NaN) - это нечто неопределенное, например, результат 0/0.

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

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

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

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

Выход:

NaN
Infinity
-Infinity
11 голосов
/ 17 июня 2009

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

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

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

2 голосов
/ 17 июня 2009

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

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

0 голосов
/ 30 марта 2016

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

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

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

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

0 голосов
/ 17 июня 2009

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

например:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
...