2016-03-22 2 views
37

Как я понимаю, что Java будет хранить поплавок в памяти как 32-битового целого числа со следующими свойствами:Каковы NaN и бесконечность поплавка или двойное хранилище в памяти?

  • Первый бит используется для определения знака
  • Следующие 8 битов представляют показатель степени
  • Окончательный 23 бит используется для хранения фракции

Это не оставляет запасные бит для трех частных случаев:

  • NaN
  • Положительный Бесконечность
  • Отрицательная бесконечность

Я могу предположить, что отрицательный 0 может быть использован для хранения одного из них.

Как они фактически представлены в памяти?

+10

подмигнули, написанные в постоянном описании '0xfff0000000000000L = -Infinity',' 0x7ff0000000000000L = + Infinity' и '0x7ff8000000000000L = NaN'. (Это значения для double) – SomeJavaGuy

+7

задокументировано в javadoc – wero

+0

Отрицательный ноль фактически также существует как отдельная вещь. – harold

ответ

52

Java указывает, что числа с плавающей точкой соответствуют стандарту IEEE 754.

Это, как он хранится:

  • бит 0: знаковый бит
  • биты 1 до 11: показатель
  • бит 12 до 63: доля

Теперь я выполнил ниже метода с различными двойными значениями:

public static void print(double d){ 
    System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d))); 
} 

я выполнил с этими значениями:

print(Double.NaN); 
print(Double.NEGATIVE_INFINITY); 
print(Double.POSITIVE_INFINITY); 
print(-Double.MAX_VALUE); 
print(Double.MAX_VALUE); 

И получил следующий результат для вышеуказанных (отформатирован для удобства чтения) значений:

NaN: 0111111111111000000000000000000000000000000000000000000000000000 
-Inf: 1111111111110000000000000000000000000000000000000000000000000000 
+Inf: 0111111111110000000000000000000000000000000000000000000000000000 
-Max: 1111111111101111111111111111111111111111111111111111111111111111 
+Max: 0111111111101111111111111111111111111111111111111111111111111111 

Wikipedia explains что, когда поле экспоненты все-бит-1, число - либо Inf, либо NaN. Inf имеет все бит ноты мантиссы; NaN имеет по крайней мере один бит в мантиссе, установленном в 1. Знак-бит сохраняет свое нормальное значение для Inf, но не имеет смысла для NaN. Java Double.NaN является одним конкретным значением, которое будет интерпретироваться как NaN, но есть 2 − 3 others.

+3

Пожалуйста, либо напишите фактический вывод, который вы получили от вашего кода, который, как он утверждает, никогда не распечатывает текст, только двоичный код или обновляет ваш код, чтобы печатать то, что вы говорите. Кроме того, потому что это трудно сравнить быстро, как она стоит, пожалуйста, выстройте номера. –

+0

Вы по-прежнему неспособны либо упростить сравнение вывода, что и код, который вы сейчас даете. Пожалуйста, напишите фактический вывод этого кода или включите код, который будет генерировать вывод, который вы даете. –

+1

Как я уже говорил, код и отформатированный вывод являются самоочевидными. То, что я терпеть неудачу, заключается в том, чтобы понять вышеупомянутый комментарий. Если у вас есть какой-то конкретный вопрос, вы можете задать ему новый вопрос о SO, и я с удовольствием отвечу. Приветствия. –

5

Как указано в Wikipedia, для идентификации этих чисел используется показатель со всеми битами, установленным в 1. Поле фракции, установленное в 0, используется для идентификации бесконечности (положительной или отрицательной, как определено знаком), а поле ненулевой фракции идентифицирует значение NaN.

17

here От:

Q. Как равны нулю, бесконечность и NaN представлены с использованием IEEE 754?

A. Установив все экспоненты бит в 1. Положительной бесконечности = 0x7ff0000000000000 (все бит экспоненты 1, знаковый бит 0 и всех мантисса бита 0), отрицательная бесконечность = 0xfff0000000000000 (все биты экспоненты 1, знаковых бит 1 и все биты мантиссы 0), NaN = 0x7ff8000000000000 (все экспоненциальные биты 1, по меньшей мере один бит бит мантиссы). Положительный ноль = все бит 0. Отрицательный ноль = все биты 0, кроме знакового бита, который является 1.

Также отсылаем JavaDocs о NAN, Positive Infinity and Negative Infinity.

+8

Это также означает, что могут быть несколько NaN, которые можно отличить друг от друга (хотя все они являются NaN). Некоторые приложения используют это для хранения дополнительной информации о характере не-номера. – Joey

3

В Java используется плавающая точка IEEE 754.

Большинство чисел выражаются в знак-экспонентах-мантиссе формата с мантиссой, имеющей неявные ведущие 1.

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

Все нули в экспоненте feild используются для представления чисел (включая как положительный, так и отрицательный ноль), которые слишком малы для представления в нормальном формате.

Все символы экспоненты используются для представления специальных значений. Если все биты в мантиссе равны нулю, значение равно плюс или минус бесконечность (знак, обозначенный знаковым битом). В противном случае это значение NaN.

0

Прежде всего нам нужно узнать, как число представлено как точка с плавающей точкой и двойное в памяти.

Общее число имеет вид: 1.M * 2^e.

(где М называются мантиссой и й показатель степень в избытке-127)

В плавающей точке

Старшего бит (старший значащий бит) используются в качестве знакового бита и тому битное число от 23 до 31 используется для экспоненциального значения в виде избытка-127, а бит-бит от 0 до 30 используется для хранения мантиссы.

В двойной

The MSB (старший значащий бит) используется как знаковый бит, и количество битов от 52 до 63 используется для экспоненциального значения в виде избыточного-127 и номер бита от 0 to используется для хранения мантиссы.

так что теперь мы находимся в состоянии понять представление NaN, Infinity в поплавке или двойном.

NaN (Не номер)

В представлении NaN все биты Экспонент являются 1 и биты мантиссы может быть что угодно, и это не имеет значения, что он находится в обращении или десятичном.

Бесконечность

В представлении всех битов Бесконечности экспоненту являются 1 и биты мантиссы равны 0, и это не имеет значения, что он находится в обращении или десятичном. положительная бесконечность это представляют как раз такой же, как и выше, но знаковый бит равен 0, а отрицательная бесконечность представлена ​​также просто же, но знаковый бит здесь 1.