Подтвердить что ты не робот

Как NaN и бесконечность поплавка или двойная память хранятся в памяти?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Из здесь:

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

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

Также см. Javadocs о NAN, позитивной бесконечности и отрицательной бесконечности.

Ответ 3

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

Ответ 4

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

Большинство чисел выражаются в формате sign-exponent-mantissa с мантиссой, имеющей неявный лидер 1.

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

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

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

Ответ 5

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

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

(где M называется мантиссой, а e - показателем в избытке-127)

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

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

В Double

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

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

NaN (не номер)

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

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

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