что такое мантисса и порядок числа
Арифметика с плавающей запятой
Числа с плавающей запятой — один из возможных способов предсталения действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений.
Число с плавающей запятой состоит из набора отдельных разрядов, условно разделенных на знак, экспоненту порядок и мантиссу. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:
Нужно еще разобраться.
Математически это записывается так:
Основание определяет систему счисления разрядов. Математически доказано, что числа с плавающей запятой с базой B=2 (двоичное представление) наиболее устойчивы к ошибкам округления, поэтому на практике встречаются только базы 2 и, реже, 10. Для дальнейшего изложения будем всегда полагать B=2, и формула числа с плавающей запятой будет иметь вид:
Что такое мантисса и порядок?
Мантисса – это целое число фиксированной длины, которое представляет старшие разряды действительного числа. Допустим наша мантисса состоит из трех бит (|M|=3). Возьмем, например, число «5», которое в двоичной системе будет равно 1012. Старший бит соответствует 2 2 =4, средний (который у нас равен нулю) 2 1 =2, а младший 2 0 =1.
Порядок – это степень базы (двойки) старшего разряда. В нашем случае E=2. Такие числа удобно записывать в так называемом стандартном виде, например «1.01e+2». Сразу видно, что мантисса состоит из трех знаков, а порядок равен двум.
3. Представление чисел с плавающей запятой сегодня
В числах одинарной точности (float/single) порядок состоит из 8 бит, а мантисса – из 23. Эффективный порядок определяется как E-127. Например, число 0,15625 будет записано в памяти как
Рисунок взят из Википедии
Чуть более подробное объяснение:
3.1 Специальные числа: ноль, бесконечность и неопределенность
Неопределенность или NaN (от not a number) – это представление, придуманное для того, чтобы арифметическая операция могла всегда вернуть какое-то не бессмысленное значение. В IEEE754 NaN представлен как число, в котором E=Emax+1, а мантисса не нулевая. Любая операция с NaN возвращает NaN. При желании в мантиссу можно записывать информацию, которую программа сможет интерпретировать. Стандартом это не оговорено и мантисса чаще всего игнорируется.
Как можно получить NaN? Одним из следующих способов:
Наглядное объяснение чисел с плавающей запятой
В начале 90-х создание трёхмерного игрового движка означало, что вы заставите машину выполнять почти не свойственные ей задачи. Персональные компьютеры того времени предназначались для запуска текстовых процессоров и электронных таблиц, а не для 3D-вычислений с частотой 70 кадров в секунду. Серьёзным препятствием стало то, что, несмотря на свою мощь, ЦП не имел аппаратного устройства для вычислений с плавающей запятой. У программистов было только АЛУ, перемалывающее целые числа.
При написании книги Game Engine Black Book: Wolfenstein 3D я хотел наглядно показать, насколько велики были проблемы при работе без плавающей запятой. Мои попытки разобраться в числах с плавающей запятой при помощи каноничных статей мозг воспринимал в штыки. Я начал искать другой способ. Что-нибудь, далёкое от и их загадочных экспонент с мантиссами. Может быть, в виде рисунка, потому что их мой мозг воспринимает проще.
В результате я написал эту статью и решил добавить её в книгу. Не буду утверждать, что это моё изобретение, но пока мне не приходилось видеть такого объяснения чисел с плавающей запятой. Надеюсь, статья поможет тем, у кого, как и у меня, аллергия на математические обозначения.
Как обычно объясняют числа с плавающей запятой
Цитирую Дэвида Голдберта (David Goldbert):
Для многих людей арифметика с плавающей запятой кажется каким-то тайным знанием.
Полностью с ним согласен. Однако важно понимать принципы её работы, чтобы полностью осознать её полезность при программировании 3D-движка. В языке C значения с плавающей запятой — это 32-битные контейнеры, соответствующие стандарту IEEE 754. Они предназначены для хранения и выполнения операций над аппроксимациями вещественных чисел. Пока я видел только такое их объяснение. 32 бита разделены на три части:
Три части числа с плавающей запятой.
Пока всё нормально. Пойдём дальше. Способ интерпретации чисел обычно объясняется с помощью такой формулы:
Именно это объяснение чисел с плавающей запятой все ненавидят.
И здесь я обычно начинаю терять терпение. Возможно, у меня аллергия на математическую нотацию, но когда я это читаю, в моём мозгу ничего не «щёлкает». Такое объяснение похоже на способ рисования совы:
Другой способ объяснения
Хоть это изложение и верно, такой способ объяснения чисел с плавающей запятой обычно не даёт нам никакого понимания. Я виню эту ужасную запись в том, что она разочаровала тысячи программистов, испугала их до такой степени, что они больше никогда не пытались понять, как же на самом деле работают вычисления с плавающей запятой. К счастью, их можно объяснить иначе. Воспринимайте экспоненту как окно (Window) или интервал между двумя соседними целыми степенями двойки. Мантиссу воспринимайте как смещение (Offset) в этом окне.
Три части числа с плавающей запятой.
Окно сообщает нам, между какими двумя последовательными степенями двойки будет число: [0,1], [1,2], [2,4], [4,8] и так далее (вплоть до [,
]. Смещение разделяет окно на
сегментов. С помощью окна и смещения можно аппроксимировать число. Окно — это отличный механизм защиты от выхода за границы. Достигнув максимума в окне (например, в [2,4]), можно «переплыть» вправо и представить число в пределах следующего окна (например, [4,8]). Ценой этого будет только небольшое снижение точности, потому что окно становится в два раза больше.
Викторина: сколько точности теряется, когда окно закрывает больший интервал? Давайте возьмём пример с окном [0,1], в котором 8388608 смещений накладываются на интервал размером 1, что даёт нам точность . В окне [2048,4096] 8388608 смещений накладываются на интервал
, что даёт нам точность
.
На рисунке ниже показано, как кодируется число 6,1. Окно должно начинаться с 4 и заканчиваться следующей степенью двойки, т.е. 8. Смещение находится примерно посередине окна.
Значение 6,1 аппроксимированное с помощью числа с плавающей запятой.
Давайте возьмём ещё один пример с подробным вычислением представлением в виде числа с плавающей точкой хорошо известного всем нам значения: 3,14.
Двоичное представление с плавающей точкой числа 3,14.
То есть значение 3,14 аппроксимируется как 3,1400001049041748046875.
Соответствующее значение в непонятной формуле:
И, наконец, графическое представление с окном и смещением:
Окно и смещение числа 3,14.
Интересный факт: если модули операций с плавающей запятой были такими медленными, почему в языке C в результате использовали типы float и double? Ведь в машине, на которой изобретался язык (PDP-11), не было модуля операций с плавающей запятой! Дело в том, что производитель (DEC) пообещал Деннису Ритчи и Кену Томпсону, что в следующей модели он будет. Они были любителями астрономии и решили добавить в язык эти два типа.
Интересный факт: те, кому в 1991 году действительно нужен был аппаратный модуль операций с плавающей запятой, могли его купить. Единственными, кому он мог понадобиться в то время, были учёные (по крайней мере, так Intel понимала потребности рынка). На рынке они позиционировались как «математические сопроцессоры». Их производительность была средней, а цена огромной (200 долларов 1993 года — это 350 долларов в 2016 году.). В результате уровень продаж оказался посредственным.
Что такое мантисса и порядок в информатике
Содержание статьи
Значение мантиссы
Мантисса – одна из частей числа, которое представлено форматом с плавающей точкой. Второй частью этого числа является показатель степени. По сути, это дробная составляющая логарифма.
Значение мантиссы в том, что по ней находится число, которое является источником логарифма. Целая часть показывает только степень десяти или тривиальный множитель, тогда как сама мантисса показывает, какое именно число должно быть умножено на тривиальный множитель, который имеет вид 0,001 или 100.
Экспоненциальная запись представляет это в следующем виде: N = M*n^p, где мантиссой является M. Для примера можно взять число 3600 и представить его в экспоненциальной записи. Получится следующее: 3600 = 3,6*10^3. Учитывая вышесказанное, мантиссой будет являться число 3,6.
Важно понимать, что число, имеющее плавающую запятую, также имеет изменяющуюся абсолютную точность и фиксированную относительную точность. Использование чисел с плавающей запятой лучше, чем представление чисел с фиксированной запятой, так как есть возможность применения большого диапазона значений, тогда как относительная точность не меняется. Это поможет понять следующий пример: форма, имеющая фиксированную запятую, позволяет представить число, которое занимает 2 разряда после запятой и 8 разрядов в целой части, в виде 8765,43; 123456,78 и так далее. Если же брать формат, имеющий плавающую запятую, можно произвести следующую запись: 1,2345678; 0,000012345678 и так далее. Однако для того, чтобы так сделать, важно иметь двухразрядное дополнительное поле, позволяющее записать показатели степени 10, начиная от 0 и кончая 1610. Общее число разрядов составит 10, то есть 8+2.
Мантисса, как для отрицательных, так и для положительных чисел, выражается в прямом коде. Различие в знаке будет отражено лишь в значении знакового разряда. Однако мантисса числа не может превышать единицы. Обычно точка в мантиссе располагается с левой стороны от старшего разряда. Для того, чтоб получить истинное значение числа, нужно умножить мантиссу на 16 в степени порядка. Порядок, полученный этим путем, называется характеристикой. Получается, что характеристика, которая отсчитывается от 64, будет всегда положительной.
В нормальной записи мантисса числа — всегда правильная дробь. Ее запись в ячейку производится так же, как запись числа с запятой в ячейку машины. Запятая фиксируется перед первым разрядом цифрового вида.
Мантисса числа, имеющая плавающую запятую, выражается шестнадцатеричными цифрами, при этом запятая располагается слева от самой высокой цифры мантиссы
Форма мантиссы
Есть две формы, позволяющие понять место применения мантиссы. Первая — нормальная форма числа. Эта форма, которая имеет мантиссу без учета знака на полуинтервале, то есть [0; 1) (0le a
Число с плавающей запятой состоит из:
* Мантиссы (выражающей значение числа без учёта порядка)
* Знака мантиссы (указывающего на отрицательность или положительность числа)
* Порядка (выражающего степень основания числа, на которое умножается мантисса)
* Знака порядка
[править] Нормальная форма и нормализованная форма
Что ты хочешь узнать?
Ответ
Нормализация мантиссы позволяет сэкономить один разряд в ее двоичном представлении. В обоих случаях заранее известно, что первый значащий разряд равен единице, поэтому его можно не хранить. Иногда это называется использованием неявного старшего бита.
Нормализация мантиссы результата независимо от режима не выполняется.
Нормализация мантиссы результата заключается в повторении операции сдвига мантиссы на один десятичный разряд с обнулением младшего разряда, а также в уменьшении порядка на единицу до тех пор, пока в знаковом разряде К2 ( Д9) не будет находиться наибольшая значащая цифра мантиссы. При переполнении разрядной сетки в области мантиссы выполнение этой процедуры может привести к переполнению разрядной сетки в области порядка.
00111001000100100000000000000000 – нули слева убираем:
111001000100100000000000000000 – нормализуем мантиссу:
1.11001000100100000000000000000 х 2^29.
Снова о числах с плавающей точкой
Несмотря на то, что вопросам точности компьютерных вычислений посвящено очень много публикаций, некоторые из них, на наш взгляд, всё же остаются не до конца четко раскрытыми. А именно:
1. Какое количество верных цифр n гарантированно имеет десятичное число, представленное двоичным m разрядным кодом в формате числа с плавающей точкой.
2. Как влияет нормализация чисел с плавающей точкой на точность представления числа при его преобразовании из одной системы счисления в другую и при арифметических действиях, выполняемых на компьютере.
3. Как влияет округление числа, представленного в двоичном виде на его десятичный эквивалент.
4. Как положение виртуальной точки в машинном слове влияет на значение числа, представленного в экспоненциальной форме.
Ниже мы попытаемся ответить на эти вопросы.
В своих рассуждениях мы будем исходить из представлений о числах с позиции классической арифметики. Нами будут рассмотрены числа, количество значащих цифр которых ограничено разрядной сеткой машинного слова. Чтобы упростить изложение будем рассматривать только положительные числа.
Как правило, прежде чем производить какие либо арифметические операции на компьютере над десятичными числами, их представляют в дробном двоичном виде в естественной форме, а затем записывают полученные числа в нормализованном экспоненциальном виде:
где М — мантисса двоичного числа, 2^-p — характеристика числа, ее еще часто называют экспонентой, p — порядок характеристики.
Двоичное число, представленное в десятичном виде, будем называть двоичным эквивалентом десятичного числа. Десятичное число, представленное в двоичном виде, будем называть двоичным эквивалентом десятичного числа.
Если в качестве мантиссы М принять естественную запись числа, то порядок характеристики в приведенной формуле будет равен нулю, а характеристика, соответственно, единице. Мы будем иметь число, представленное как F = M*2^0=M. Например, двоичное число F= 0.011 имеет порядок p=0. Если точку в числе условно поставить перед старшей значащей цифрой, то порядок характеристики p=-1 и F=0.11*10^-1. Если точку в числе условно поставить сразу после старшей значащей цифры, то порядок p=-2 и F=1.1*10^-2. Если виртуальную точку поставить после младшего разряда мантиссы М, то мантисса будет целым числом и для нее p=-3, а F=11*10^-3. Как мы видим, во всех случаях порядок характеристики равен количеству смещений виртуальной точки в числе относительно ее положения в естественной записи. Все виды записи в наших примерах эквивалентны и имеют одно и то же значение.
Таким образом, значение показателя характеристики числа, представленного в экспоненциальном виде, с учетом положения виртуальной точки, определяет место точки в числе, записанном в естественном виде.
Разрядность машинной мантиссы однозначно определяет количество десятичных чисел, которое может быть представлено в этой мантиссе в двоичном виде. А положение виртуальной точки в мантиссе определяет область на числовой оси, где располагаются эти числа. Двоичные числа, количество значащих цифр которых не превышает количества разрядов машинной мантиссы, являются точными, а десятичные числа, полученные конвертацией этих двоичных чисел в десятичные, называются представимыми.
В силу того, что не все значащие цифры двоичного числа могут уместиться в разрядную сетку машинной мантиссы, это число округляют до необходимого количества значащих цифр. Такое число иногда называют округленным до ближайшего представимого. Округленное двоичное число становится приближенным.
Не смотря на то, что все двоичные числа являются эквивалентом представимых десятичных чисел, не все десятичные числа можно представить в машинном слове. Это связано с несоразмерностью десятичной и двоичной систем счисления. Поэтому десятичные числа, в основном, могут быть представлены в двоичном виде приближенно, в то время как все двоичные числа могут быть представлены в десятичном виде точно. Или, другими словами. Двоичный эквивалент десятичного числа конечной длительности может содержать бесконечное количество значащих цифр. Десятичный эквивалент двоичного числа конечной длительности содержит конечное число значащих цифр.
Приближенные числа состоят из верных (в широком смысле) и неверных цифр. Неверные цифры при арифметических действиях искажают конечный результат. Чтобы этого не происходило, приближенные числа округляют до ближайшей верной цифры.
Округление двоичных чисел приводит к уменьшению учитываемых верных цифр в округленном числе и к изменению неверных цифр в его десятичном эквиваленте. Неверные цифры образуют абсолютную погрешность преобразования.
Округление двоичного числа до ближайшего представимого приводит к увеличению погрешности представления десятичного эквивалента этого числа. Это связано с тем, что при округлении двоичного числа уменьшается количество значащих двоичных цифр, участвующих в представлении его десятичного эквивалента.
В результате преобразования десятичного числа в двоичное, с заданным количеством значащих цифр, получается двоичное число, десятичный эквивалент которого будет приближенным числом, содержащим как верные, так и неверные цифры.
Определим, какое количество верных цифр n гарантированно имеет десятичное число, представленное двоичным m разрядным кодом в формате числа с плавающей точкой.
Для того чтобы десятичное число с n значащими цифрами гарантированно было представлено двоичным кодом с мантиссой, имеющей m разрядов, должно выполняться условие: (10^n)-1 ≤ (2^m)-1 или 10^n ≤ 2^m. Откуда log1010^n≤ log102^m или n≤ m log102. Поскольку log102≈0.3, то будет справедливо неравенство n≤0.3m. Поскольку числа m и n целые, для них будет справедливо неравенство
n≤⌊0.3m⌋. Так, для m=8, будем иметь n≤⌊0.3*8⌋=2.
До сих пор мы говорили о целочисленной машинной мантиссе. На практике же принято считать машинную мантиссу дробным числом с виртуальной точкой, стоящей перед старшим разрядом. Эта виртуальная точка преобразует целое число, записанное в машинной мантиссе в дробное число. Преобразование целого двоичного числа с m значащими цифрами в число, которое представляет собой правильную дробь, равносильно умножению этого числа на коэффициент 2^-m. Таким образом, если в каждом разряде m разрядной машинной мантиссы записаны только единицы и при этом предполагается, что виртуальная точка стоит в начале мантиссы, то число, представленное в этой мантиссе, будет максимальным и будет равно Mmaxd = 1-2^-m. Где Mmaxd — максимальное дробное число, которое может быть представлено в m разрядной машинной мантиссе с виртуальной точкой в начале мантиссы.
С другой стороны, если машинную мантиссу считать целочисленной, т.е. полагать, что виртуальная точка стоит сразу за младшим разрядом машинной мантиссы, то максимальное целое число Mmaxc, которое в нее можно записать, будет состоять из одних единиц и равно Mmaxc = (2^m)-1. Если теперь точку переместить в начало мантиссы, то это будет равносильно тому, что Mmaxd= Mmaxc*2^-m.
Таким образом, в m разрядную машинную мантиссу можно записать дробные числа, лежащие в диапазоне от 0 до Mmaxc*2^-m. Где Mmaxc — максимальное целое двоичное число, которое помещается в машинную мантиссу.
В общем случае от выбора виртуальной точки зависит только значение порядка характеристики числа, представленного в экспоненциальном виде. Само же значение числа остается неизменным.
Например, в трехразрядную машинную мантиссу можно записать максимальное целое число 1112 = 7. Это число с виртуальной точкой перед старшим разрядом машинной мантиссы будет иметь значение 0.111=7*2^-3= 0,875. Записанное в машинной мантиссе число 1012 = 5 с виртуальной точкой перед старшим разрядом будет иметь значение 0.1012=5*2^-3= 0,625 и т.д.
В разных источниках в настоящее время высказываются различные мнения о точности представления десятичных чисел в двоичном коде. Не затрагивая здесь вопроса точности двоичных арифметических операций над десятичными числами, представленными в двоичном виде, рассмотрим точность конвертации десятичных чисел в двоичные.
Для того чтобы рассмотренные в примерах выше целочисленные мантиссы сместить в область дробных чисел, надо все числа умножить на масштабный коэффициент 2^-53. Тогда максимальное двоичное дробное число в 53-х разрядной машинной мантиссе будет иметь вид:
0.11111111111111111111111111111111111111111111111111111 = 11111111111111111111111111111111111111111111111111111 *2^-53= 9007199254740991*2^-53= 0,99999999999999988897769753748435. Жирным шрифтом помечены верные цифры, соответствующие значащим десятичным цифрам максимального пятнадцатизначного дробного десятичного числа.
Чтобы десятичное число было преобразовано к двоичному виду максимально точно, необходимо, чтобы в двоичном представлении десятичного числа было учтено как можно больше значащих цифр. В идеале, количество значащих цифр двоичной мантиссы числа должно быть равно количеству разрядов машинной мантиссы. Для этой цели десятичное число разлагают по степеням двойки до тех пор, пока количество значащих цифр двоичного числа не сравняется с количеством разрядов машинной мантиссы или не будет разложено точно. Полученное таким образом число нормализуют, смещая старшую значащую цифру числа в старший разряд машинной мантиссы. А в машинную область порядка характеристики помещают масштабный коэффициент, равный количеству сдвигов старшей значащей цифры числа. Процедура нормализации никак не меняет значение числа, а следовательно и точность его представления.
Для примера возьмем компьютер с 8-ми разрядной мантиссой. Гарантированное количество значащих десятичных цифр, которое можно представить в 8-ми разрядной машинной мантиссе равно n ≤ ⌊0.3*8⌋=2. Пусть нам дано число 0.0012. Это число в двоичном виде будет равно ≈ 0.00000000010011101010010. Округлим это число до 8 значащих цифр, количество которых соответствует размеру разрядной сетки машинной мантиссы. Получим число 0.00000000010011101= 0.00119781494140625≈0.0012. Нормализуем это число, поместив в машинную мантиссу все значащие цифры мантиссы числа. Получим 0.00000000010011101010010= 0.10011101*2^-9 = 0,61328125*2^-9=0,00119781494140625. Как мы видим, значение числа не изменилось после нормализации. Точность представления числа также не изменилась, т.к. количество значащих цифр после нормализации осталось неизменным. Мы просто получили другую форму записи одного и того же числа.
В случае если при нормализации двоичного числа окажется, что количество сдвигов старшей значащей цифры числа превышает количество разрядов машинной области, которая предназначена для записи порядка характеристики числа, то число не может быть записано в нормализованном виде. В этом случае происходит потеря точности за счет того, что часть, или все значащие цифры числа оказываются за пределами разрядной сетки машинной мантиссы.
В том случае, когда в результате арифметической операции получено двоичное число, все значащие цифры которого расположены в пределах машинной мантиссы, нормализация результата, с точки зрения арифметики, не имеет смысла.
Например, пусть мы имеем компьютер с 8-ми разрядной машинной мантиссой, в котором виртуальная точка размещена перед старшим разрядом мантиссы. Найдем разность двух двоичных чисел: 0.10110000-0.10010011=0.00011101. Значащие цифры разности полностью поместились в разрядную сетку машинной мантиссы. Десятичный эквивалент этой разности будет равен 0.6875-0.57421875=0.11328125. Нормализуем число 0.00011101. Будем иметь 0.00011101=0.11101*2^-3=0.90625*2^-3=0.11328125. Мы видим, что нормализация никак не изменила значения разности чисел и поэтому в дальнейших вычислениях эти две записи результата, с точки зрения математики, эквивалентны.
СУХОЙ ОСТАТОК
Любое число можно представить в экспоненциальном виде с виртуальной точкой, расположенной в любом месте мантиссы. Смещение точки от ее естественного положения записывается в область машинного слова, выделенную для записи порядков характеристик.
Разрядность машинной мантиссы определяет количество десятичных чисел, которое может быть представлено в этой мантиссе. А положение виртуальной точки в мантиссе определяет область на числовой оси, где располагаются эти числа.
Положение виртуальной точки никак не влияет на точность представления числа.
Точность представления двоичного числа зависит от количества значащих цифр мантиссы, которое можно записать в машинное слово.
Все двоичные числа являются эквивалентом представимых десятичных чисел. Десятичные числа не все являются представимыми в машинном слове. Десятичные действительные числа, в основном, могут быть представлены в двоичном виде приближенно, в то время как все двоичные числа могут быть представлены в десятичном виде точно.
Округление двоичных чисел приводит к уменьшению учитываемых верных цифр в округленном двоичном числе, за счет отбрасывания цифр, не вместившихся в разрядную сетку машинной мантиссы и, как следствие, к уменьшению точности представления десятичного эквивалента.
Округление двоичных действительных чисел приводит к изменению неверных цифр в их десятичном эквиваленте, но не к ликвидации неверных десятичных цифр.
Неверные десятичные цифры в десятичном эквиваленте двоичного числа, полученного из точного десятичного числа, образуют абсолютную погрешность преобразования.
В машинной мантиссе с m разрядами можно гарантированно представить десятичное число, количество верных цифр в котором n≤⌊0.3m⌋.
Нормализация двоичных чисел никак не меняет значения числа, если она осуществляется без округления.
Нормализация не влияет на точность представления числа, если она осуществляется без округления.