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

Как числа с плавающей запятой хранятся в памяти?

Я читал, что они хранятся в форме мантиссы и экспоненты

Я читал этот документ, но я ничего не мог понять.

4b9b3361

Ответ 1

Чтобы понять, как они хранятся, вы должны сначала понять, что они собой представляют и какие ценности они предназначены для обработки.

В отличие от целых чисел значение с плавающей запятой предназначено для представления крайне малых значений, а также очень больших. Для нормальных 32-битных значений с плавающей запятой это соответствует значениям в диапазоне от 1.175494351 * 10 ^ -38 до 3.40282347 * 10 ^ + 38.

Ясно, что, используя только 32 бита, невозможно сохранить каждую цифру в таких числах.

Когда дело доходит до представления, вы можете видеть все нормальные числа с плавающей запятой как значение в диапазоне от 1.0 до (почти) 2.0, масштабируемое с мощностью в два. Итак, 1.0, просто 1.0 * 2 ^ 0. 2.0 1.0 * 2 ^ 1. -5.0 является -1.25 * 2 ^ 2.

Итак, это необходимо для кодирования этого, как можно более эффективно? Что нам действительно нужно?

  • Знак выражения.
  • Показатель
  • Значение в диапазоне от 1.0 до (почти) 2.0. Это известно как "мантисса", то есть значимое.

Это кодируется следующим образом, в соответствии со стандартом IEEE-754 с плавающей запятой.

  • Знак - это один бит.
  • Показатель хранится как целое число без знака, для 32-битовых значений с плавающей запятой, это поле составляет 8 бит. 1 представляет наименьший показатель, а "все - 1" - самый большой. (0 и "все единицы" используются для кодирования специальных значений, см. Ниже.) Значение в середине (127, в 32-битном случае) представляет нуль, это также известно как смещение.
  • При просмотре мантиссы (значение от 1.0 до (почти) 2.0) можно увидеть, что все возможные значения начинаются с "1" (как в десятичном, так и в двоичном представлении). Это означает, что нет смысла его хранить. Остальные двоичные цифры хранятся в целочисленном поле, в 32-битном случае это поле составляет 23 бита.

В дополнение к нормальным значениям с плавающей запятой существует ряд специальных значений:

  • Zero кодируется как показателем, так и мантисса как ноль. Битовый знак используется для представления "плюс ноль" и "минус нуль". Минус-ноль полезен, когда результат операции чрезвычайно мал, но все же важно знать, из какого направления была выполнена операция.
  • плюс и минус бесконечность - представлены с использованием показателя "все единицы" и поля нулевой мантиссы.
  • Не число (NaN) - представлено с использованием показателя "все единицы" и ненулевой мантиссы.
  • Денормализованные числа - числа, меньшие наименьшего нормального числа. Представляет собой поле нулевой экспоненты и ненулевую мантису. Особая вещь с этими числами заключается в том, что точность (то есть количество цифр, которое может содержать значение) будет уменьшать меньшее значение, просто потому, что в мантиссе нет места.

Наконец, ниже приводится несколько конкретных примеров (все значения в шестнадцатеричном виде):

  • 1.0: 3f800000
  • -1234.0: c49a4000
  • 100000000000000000000000.0: 65a96816

Ответ 2

В непрофессиональных терминах это существенно научная нотация в двоичном формате. Формальный стандарт (с подробностями) IEEE 754.

Ответ 3

  typedef struct {
      unsigned int mantissa_low:32;     
      unsigned int mantissa_high:20;
      unsigned int exponent:11;        
      unsigned int sign:1;
    } tDoubleStruct;

double a = 1.2;
tDoubleStruct* b = reinterpret_cast<tDoubleStruct*>(&a);

Пример установки памяти, если компилятор использует двойную точность IEEE 754, которая используется по умолчанию для двойного C в системах с прямым порядком байтов (например, Intel x86).

Здесь он находится в двоичной форме на основе Си и лучше прочитайте википедию о двойной точности, чтобы понять это.

Ответ 4

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

Стандарт с плавающей запятой IEEE пытается определить один формат (или, скорее, набор форматов нескольких размеров), который может быть реализован в различных системах. Он также определяет доступные операции и их семантику. Он поймал довольно хорошо, и большинство систем, с которыми вы, вероятно, столкнетесь, вероятно, с плавающей точкой IEEE. Но другие форматы все еще используются, а также не совсем полные реализации IEEE. Стандарт C предоставляет дополнительную поддержку для IEEE, но не предусматривает его.

Ответ 5

Мантисса представляет собой наиболее значимые биты числа.

Показатель показывает, сколько сдвигов должно выполняться на мантиссе, чтобы получить фактическое значение числа.

Кодирование определяет, каким образом представлен знак мантиссы и знак экспоненты (в основном, сдвигаясь влево или вправо).

Документ, на который вы ссылаетесь, указывает кодировку IEEE, наиболее широко используемую.

Ответ 6

Я нашел статью, на которую вы ссылались, совершенно неразборчив (и я немного знаю, как работает IEEE). Я предлагаю вам попробовать версию Wiki для объяснения. Это совершенно понятно и имеет различные примеры:

http://en.wikipedia.org/wiki/Single_precision и http://en.wikipedia.org/wiki/Double_precision

Ответ 7

Это определяется реализацией, хотя IEEE-754 является наиболее распространенным на сегодняшний день.

Чтобы быть уверенным, что используется IEEE-754:

  • в C используйте #ifdef __STDC_IEC_559__
  • в C++ используйте константы std::numeric_limits<float>::is_iec559

Я написал несколько руководств по IEEE-754 по адресу: