Я читал, что они хранятся в форме мантиссы и экспоненты
Я читал этот документ, но я ничего не мог понять.
Я читал, что они хранятся в форме мантиссы и экспоненты
Я читал этот документ, но я ничего не мог понять.
Чтобы понять, как они хранятся, вы должны сначала понять, что они собой представляют и какие ценности они предназначены для обработки.
В отличие от целых чисел значение с плавающей запятой предназначено для представления крайне малых значений, а также очень больших. Для нормальных 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.
Итак, это необходимо для кодирования этого, как можно более эффективно? Что нам действительно нужно?
Это кодируется следующим образом, в соответствии со стандартом IEEE-754 с плавающей запятой.
В дополнение к нормальным значениям с плавающей запятой существует ряд специальных значений:
Наконец, ниже приводится несколько конкретных примеров (все значения в шестнадцатеричном виде):
В непрофессиональных терминах это существенно научная нотация в двоичном формате. Формальный стандарт (с подробностями) IEEE 754.
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).
Здесь он находится в двоичной форме на основе Си и лучше прочитайте википедию о двойной точности, чтобы понять это.
Существует несколько различных форматов с плавающей запятой. Большинство из них имеют несколько общих характеристик: бит знака, некоторые биты, предназначенные для хранения экспоненты, и некоторые биты, предназначенные для хранения значимости (также называемой мантиссой).
Стандарт с плавающей запятой IEEE пытается определить один формат (или, скорее, набор форматов нескольких размеров), который может быть реализован в различных системах. Он также определяет доступные операции и их семантику. Он поймал довольно хорошо, и большинство систем, с которыми вы, вероятно, столкнетесь, вероятно, с плавающей точкой IEEE. Но другие форматы все еще используются, а также не совсем полные реализации IEEE. Стандарт C предоставляет дополнительную поддержку для IEEE, но не предусматривает его.
Мантисса представляет собой наиболее значимые биты числа.
Показатель показывает, сколько сдвигов должно выполняться на мантиссе, чтобы получить фактическое значение числа.
Кодирование определяет, каким образом представлен знак мантиссы и знак экспоненты (в основном, сдвигаясь влево или вправо).
Документ, на который вы ссылаетесь, указывает кодировку IEEE, наиболее широко используемую.
Я нашел статью, на которую вы ссылались, совершенно неразборчив (и я немного знаю, как работает IEEE). Я предлагаю вам попробовать версию Wiki для объяснения. Это совершенно понятно и имеет различные примеры:
http://en.wikipedia.org/wiki/Single_precision и http://en.wikipedia.org/wiki/Double_precision
Это определяется реализацией, хотя IEEE-754 является наиболее распространенным на сегодняшний день.
Чтобы быть уверенным, что используется IEEE-754:
#ifdef __STDC_IEC_559__
std::numeric_limits<float>::is_iec559
Я написал несколько руководств по IEEE-754 по адресу: