Что значит вещественное число в информатике

от admin

Что значит вещественное число в информатике

Форма записи числа с фиксированной точкой точно определяет положение точки между целой и дробной частью. Запись числа с фиксированной точкой обычно имеет знаковый и цифровой разряды. Фиксированная точка означает, что на этапе конструирования было определено, сколько и какие разряды машинного слова отведены под изображение целой и дробной частей числа. Точка в разрядкой сетке может быть зафиксирована, в принципе, после любого разряда.

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

Для представления чисел с плавающей точкой (ЧПТ) используется следующая форма записи числа:

где q — основание системы счисления, p — порядок числа, m — мантисса числа N, представляющая собой правильную положительную дробь.

Положение точки определяется значением порядка p . С изменением порядка точка перемещается (плавает) влево или вправо. Так, например, число 156 10 можно записать как

156 10 = 15.6 * 10 1

156 10 = 0.156 • 103

0.0156 • 104 и т. д.

Для установления однозначности при записи чисел введем ограничение — в первом разряде мантиссы стоит отличная от нуля цифра.

Такое представление числа называется нормализованным. Например, из всех возможных записей числа 156 (см. выше) нормализованная форма числа будет представлена как 0.156 • 10 3 . Мантисса здесь, очевидно, равна 0.156, а порядок равен 3.

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

Представление чисел в нормализованной форме для десятичной системы счисления не вызывает затруднений, что касается представления двоичных чисел, то необходимо помнить, что порядок числа — двоичное число. Например, число 10111.01 2 имеет порядок, равный 5 (10111) в десятичной системе, но в двоичной —5 10 = 101 2

следовательно, нормализованная форма — 0.1011101 , 2 101 .

Для представления чисел в машинном слове выделяют группы разрядов для изображения мантиссы, порядка, знака порядка и знака числа (рис. 2.41). В этом случае машинное слово делится на два основных поля. В одном записывается мантисса числа, во втором — указывается порядок числа.

Например, число -12.25 10 — -1100.01,=* -0.110001*2 ,0 ° будет представлено следующим образом:

Таким образом, числа с плавающей точкой позволяют увеличить диапазон обрабатываемых чисел по сравнению с диапазоном чисел с фиксированной точкой. Однако быстродействие компьютера при обработке чисел с плаваю щей точкой гораздо ниже, чем при обработке чисел с фиксированной точкой.

Вещественные числа в памяти компьютера. Объяснение.

Добрый день! Изучая лекцию «Нюансы работы с вещественными числами» первого квеста (раздел 2. Устройство чисел с плавающей точкой) и дополнительные лекции по теме, многие, должно быть, столкнулись со множеством вопросов на эту тему. Изначально я постаралась дать сама себе необходимые ответы, а теперь предлагаю их вам в помощь для полноценного понимания в последовательном логическом порядке. 1. Десятичные и двоичные системы счисления. 1.1 Десятичная система счисления — одна из наиболее распространённых систем, именно ей мы пользуемся при любых НЕ компьютерных математических вычислениях в школе, в вузе, в жизни. В ней используются цифры 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 (арабские) — всего 10 цифр. Также есть римская запись чисел, которая, однако, практически не применяется сейчас. В десятичной системе счет ведется единицами, десятками, сотнями, тысячами, десятками тысяч, сотнями тысяч, миллионами и т.д. — иными словами, это все разряды числа. Разряд числа — это позиция (место) цифры в записи числа. Самый младший разряд натуральных чисел (и самый малозначимый) — это разряд единиц (самый правый). Почему он самый малозначимый? Потому что, отбросив единичный разряд числа, само число изменится минимально( например, числа 345 и 340). Далее второй разряд — это разряд десятков и т.д. Что это все значит? Возьмем любое целое число в десятичной системе и разложим его на разряды. 3297 = 3*1000 + 2*100 + 9*10 + 7 Таким образом получаем, что в числе 3297 содержится 3 единицы четвертого разряда (то есть 3 тысячи), 2 единицы третьего разряда (2 сотни), 9 единиц второго разряда (9 десятков) и 7 единиц первого разряда. Иными словами, это число три тысячи двести девяносто семь и оно является, соответственно, позиционным. А что же с разрядами дробных (вещественных) чисел? Разряды дробных чисел (их дробной части) называются: десятые, сотые, тысячные, десятитысячные и т.д. Чем дальше от запятой (от целой части числа) разряд — тем он менее значим (отбросив его, значение числа мало поменяется). Для примера возьмем любое дробное число, представленное в виде десятичной дроби: 25,076 = 2*10 + 5 +0*0,1 + 7*0,01 +6*0,001 Таким образом, получаем, что в дробном числе 25,076 содержится 2 десятка, 5 единиц, 0 десятых, 7 сотых и 6 тысячных. В десятичной системе используются 10 цифр и кратные 10-и разряды — отсюда и название «десятичная». 1.2 Двоичная система счисления — система счисления, применяемая практически во всех современных компьютерах и прочих вычислительных электронных устройствах. Для записи чисел в ней используются только две цифры — 0 и 1. Чтобы не путать, в какой системе счисления записано число, его снабжают указателем справа внизу (он является основанием системы счисления), например: 1000₁₀ 1000₂ Здесь первое число — привычная нам тысяча в десятичной системе, а нижнее — это число в представлении двоичной системы и равно оно в десятичной системе. 8! Как и в десятичной системе, в двоичной системе числа также разбиваются на разряды. Каждая цифра в двоичном числе называется бит (или разряд). (Если кому-то интересно, то четыре бита – это полубайт (или тетрада), 8 бит – байт, 16 бит – слово, 32 бита – двойное слово). Нумеруются биты (разряды) также справа налево, начиная с нуля (в отличие от десятичной системы). Самый младший, малозначимый, правый бит имеет порядковый номер 0. Далее идет первый бит, второй и т.д., чем старше бит — тем он значимее (по аналогии с понятной нам десятичной системой — если из числа 1455 выкинуть единицы, останется число 1450 — почти равное начальному. А вот если выкинуть сотни, останется число 1050, которое уже далеко от начального значения, т.к. разряд сотен является куда более значимым (старшим), чем разряд единиц). Пример. Внизу красным цветом пронумерованы биты этого дробного двоичного числа — всего у нас получилось 18 битов (разрядов) данного числа. Забегая вперед, хочу отметить, что в памяти компьютера дробные числа хранятся совсем по-другому — об этом будет рассказано далее. А пока давайте научимся переводить числа из одной системы счисления в другую. 2. Перевод целых и дробных чисел из десятичной системы в двоичную и наоборот. 2.1 Перевод из десятичной системы в двоичную. 2.1.1 Целые числа. Для того, чтобы перевести целое десятичное число в двоичную систему счисления, необходимо разделить это число на 2, записать остаток от деления (он всегда равен 0 или 1, в зависимости от того, четное число или нечетное), а результат деления снова поделить на 2, снова записать остаток от деления (0 или 1), а результат от второго деления снова поделить на 2. Так продолжать до тех пор, пока результат деления не станет равным единице. Далее запишем все полученные нули и единицы в обратном порядке, начиная с самого последнего результата деления, всегда равного 1. Важное примечание. Конечным результатом последовательного деления ЛЮБОГО ЦЕЛОГО ЧИСЛА на 2 всегда в итоге будет единица (1) ! Если результат больше 1 — мы продолжаем делить этот результат на 2,пока не получим единиц в результате. А нулем (0) результат деления на 2 может быть только в единственном случае — это деление самого нуля на 2. Пример. Переведем число 145 из десятичной системы в двоичную. 145/2 = 72 (остаток 1) 72/2 = 36 (остаток 0) 36/2 = 18 (остаток 0) 18/2 = 9 (остаток 0) 9/2 = 4 (остаток 1) 4/2 = 2 (остаток 0) 2/2 = 1 (остаток 0) Теперь «собираем» наше двоичное число в обратном порядке. Получаем число 10010001. Готово! Интересный нюанс 1. Переведем число 1 из десятичной системы в двоичную. В двоичной системе это число также будет записано как 1. Ведь конечный результат деления на 2, который должен быть равен 1, уже равен самому числу 1. 1₁₀ = 1₂ Интересный нюанс 2. Переведем число 0 из десятичной системы в двоичную. В двоичной системе это число также будет записано как 0. 0₁₀ = 0₂ 2.1.2 Дробные числа. А как перевести дробные числа в двоичную систему? Чтобы перевести десятичную дробь в двоичную систему счисления, необходимо: а) целую часть дроби перевести в двоичную систему согласно изученному алгоритму в пункте 2.1.1 б) дробную часть дроби умножить на 2, записать полученную цифру результата ДО запятой (всегда равна 0 или 1, что логично), далее ТОЛЬКО дробную часть полученного результата снова умножить на 2, снова записать полученную цифру результата ДО запятой (0 или 1) и так далее, пока дробная часть результата умножения не станет равна 0 или до требуемого количества знаков после запятой (требуемой точности) (равно количеству умножений на 2). Затем необходимо записать полученную последовательность записанных нулей и единиц ПО ПОРЯДКУ после точки, разделяющей целую и дробную части вещественного (дробного) числа. Пример 1. Переведем число 2.25 (2 целых 25 сотых) из десятичной системы в двоичную. В двоичной системе дробь будет равна 10.01. Как мы это получили? Число состоит из целой части ( до точки) — это 2 и дробной части — это 0.25. 1) Перевод целой части: 2/2 = 1 (остаток 0) Целая часть будет 10. 2)Перевод дробной части. 0.25 * 2 = 0.5 (0) 0.5 * 2 = 1.0 (1) Дробная часть стала в результате последовательного умножения на 2 стала равна 0. Прекращаем умножение. Теперь «собираем» дробную часть ПО ПОРЯДКУ — получаем 0.01 в двоичной системе. 3)Складываем целую и дробную части — получаем, что десятичная дробь 2.25 будет равна двоичной дроби 10.01. Пример 2. Переведем число 0.116 из десятичной системы в двоичную. 0.116 * 2 = 0.232 (0) 0.232 * 2 = 0.464 (0) 0.464 * 2 = 0.928 (0) 0.928 * 2 = 1.856 (1) //отбрасываем целую часть данного результата 0.856 * 2 = 1.712 (1) //отбрасываем целую часть данного результата 0.712 * 2 = 1.424 (1) //отбрасываем целую часть данного результата 0.424 * 2 = 0.848 (0) Как мы видим, умножение продолжается и продолжается, дробная часть результат никак не становится равной 0. Тогда решим, что мы переведем нашу десятичную дробь в двоичную с точностью до 7 знаков (бит) после точки (в дробной части). Вспоминаем, что мы же изучали про малозначимые разряды — чем дальше разряд (бит) от целой части, тем легче мы можем им пренебречь (объяснение в разделе 1 лекции, кто забыл). Получаем двоичную дробь 0.0001110 с точностью до 7 бит после точки. 2.2 Перевод из двоичной системы в десятичную. 2.2.1 Целые числа. Для того, чтобы перевести целое число из двоичной системы счисления в десятичную, необходимо разбить это число на разряды (биты) и каждый разряд (бит) умножить на число 2 в определенной положительной степени ( данная степень начинает отсчет справа налево от самого младшего (правого бита) и начинается с 0). Иными словами, степень двойки равна номеру данного бита (но это негласное правило можно использовать только в случае перевода целых чисел, так как у дробных чисел нумерация битов начинается в дробной части, которая переводится в десятичную систему по-другому). Далее нужно сложить полученные произведения. Пример. Переведем двоичное число 110011 в десятичную систему счисления. 110011₂ = 1*2⁵ + 1*2⁴ + 0*2³ + 0*2² + 1*2¹ + 1*2º = 32 +16 +0 + 0 + 2 + 1 = 51₁₀ В итоге получаем число 51 в двоичной системе. Для информации, ниже приведена таблица первых степеней числа 2. НЕ ЧИТАТЬ ПОКА:))) Вещественные числа в памяти компьютера. НА ДОРАБОТКЕ. - 5! Обратите внимание, нулевая степень числа всегда равна 1. 2.2.2 Дробные числа. Для того, чтобы перевести двоичное дробное (вещественное) число в десятичное, необходимо: а) перевести его целую часть в десятичную согласно алгоритму из пункта 2.2.1; б) перевести его дробную часть следующим образом. Нужно представить дробную часть в виде суммы произведений разрядов на двойку, возведенную в определенную отрицательную степень (степень для первого разряда после точки(после целой части дроби) будет равна -1, для второго разряда после точки равна -2 и т.д.) Результат данной суммы и будет дробной частью числа в десятичной системе. Пример. Переведем число 10111.01 в двоичную систему. 10111.01₂ = (1*2⁴ + 0*2³ + 0*2² + 1*2¹ + 1*2º) . (0*2ˉ¹ + 1*2ˉ²) = (16 + 0 + 4 + 2 + 1) . (0 + 0.25) = 23.25₁₀ В итоге получаем число 23.25 в десятичной системе счисления. Таблица первых отрицательных степеней 2 приведена ниже. НЕ ЧИТАТЬ ПОКА:))) Вещественные числа в памяти компьютера. НА ДОРАБОТКЕ. - 7 2.2.3 Общая формула перевода чисел из двоичной системы в десятичную. Приведем общую формулу перевода чисел из двоичной системы в десятичную (и целой, и дробной частей). НЕ ЧИТАТЬ ПОКА:))) Вещественные числа в памяти компьютера. НА ДОРАБОТКЕ. - 4где A — число в двоичной системе счисления; основание системы счисления равно 2 (значит, каждый бит умножается на 2 в степени); n — количество целых разрядов (битов) ; m — количество дробных разрядов (битов) числа. Красным выделен первый от разделяющей точки бит целой части. Он всегда умножается на 2 в нулевой степени. Следующий перед ним (налево) бит умножается на 2 в первой степени и т.д. Зеленым выделен первый от разделяющей точки бит дробной части. Он всегда умножается на 2 в минус первой степени. Следующий за ним (направо) бит умножается на 2 в минус второй степени и т.д. 3. Экспоненциальная форма записи числа: нормализованная форма записи в обеих системах. Мантисса, экспонента, степень экспоненты. 3.1 Экспоненциальная форма записи числа. Ранее мы изучили подробную схему записипозиционных чисел по разрядам. Возьмем число 0.0000000000000000000016 . Оно имеет очень длинную запись в стандартном виде. А в экспоненциальном виде оно будет выглядеть так: 1.6 * 10ˉ²¹ Так что же такое экспоненциальная форма числа и как представить число в этой форме? Экспоненциальная запись числа — это представление действительных чисел в виде мантиссы и порядка. Удобна для представления очень больших и очень малых чисел, а также для унификации их написания. N = M * pⁿ где N — записываемое число, Ммантисса числа, p — основание (равно основанию системы счисления данного числа), n(целое) — порядок (степень, может быть положительной и отрицательной), p в степени n — характеристика числа (экспонента, т.е. основание, возведенное в степень (порядок)). Важный нюанс. Если целая часть десятичного числа отлична от 0, то порядок (степень) экспоненты будет положительным, если целая часть же равна 0 — степень экспоненты будет отрицательной. 3.2 Нормальная и нормализованная форма записи чисел. Нормальной формой числа называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале [0,1), то есть 0<= M < 1. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать как 0,000001*10², 0,00001⋅10¹, 0,0001⋅10º, 0,001⋅10ˉ¹ и так далее). Потому распространена (особенно в информатике) другая форма записи — нормализованная, в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (исключая), то есть 1<= M < 10 (аналогично, мантисса двоичного числа принимает значения от 1 до 2). Иными словами, мантиcса в десятичной системе должна представлять собой дробное число от 1.0 (включительно) до 10(исключая), т.е. в целой части мантиссы должна быть одна-единственная цифра, а дробная часть математически не ограничена. Достоинство нормализованной формы в том, что, таким образом, любое число (кроме 0) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить 0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа 0. 3.3 Примеры записи десятичных чисел в экспоненциальной нормализованной форме. Давайте рассмотрим примеры. Пример 1. Запишем десятичное число 1015000 (один миллион пятнадцать тысяч) в экспоненциальном нормализованном виде. Система счисления этого числа десятичная, поэтому основание будет 10. Выделим мантиссу. Для этого представим число в виде дроби, дробная часть которой будет равна, соответственно, нулю (так как число целое): 1000000.0. Если целая часть числа больше 0, то двигаем точку влево от ее начального положения (внутрь целой части) до тех пор, пока в целой части не останется одна-единственная цифра. После нее ставим точку. Отбрасываем незначимые нули (на конце числа). Получаем мантиссу числа, равную 1.015. Определим степень (порядок) основания числа. На сколько позиций влево сдвинулась наша разделяющая целую и дробную части точка? На шесть позиций. Значит, порядок будет равен 6. При этом порядок положительный ( двигали точку в целой части числа, не равной 0). Итоговая запись в нормализованном виде: 1.015 * 10⁶. Мы можем записать это число и в таком варианте: 1.015Е6 (где Е6 — это экспонента десятичного числа, то есть 10 в 6 степени). Давайте проверим себя. Экспоненциальная запись числа представляет из себя нечто иное, как произведение числа (мантиссы) на другое число (экспоненту). Что будет, если умножить 1.015 на 10⁶? 1.015*10⁶ = 1.015*1000000 = 1015000. Все верно. Такой подход (нормализованный) помогает создать однозначную запись числа в экспоненциальном виде, как и указано выше. Пример 2. Запишем десятичное вещественное число 0.0098 в нормализованном виде. Выделим основание числа — оно равно 10 (десятичная система счисления). Выделим мантиссу числа — она равна 9.8 (целая часть числа равна нулю, значит двигаем точку вправо до первой значащей цифры (лежащей в интервале от 1 до 9 включительно). Определяем порядок числа — мы подвинули точку на три позиции, значит порядок равен 3. Положительный он или отрицательный? Так как мы двигали точку вправо ( в дробной части числа),то порядок (степень) будет отрицательным. Итоговая запись числа в нормализованном виде — это 9.8 * 10ˉ³ или 9.8Е-3. Давайте снова проверим себя. Умножим 9.8 на 10ˉ³. 9.8 * 10ˉ³ = 9.8 * 0.001 = 0.0098. Все верно. Пример 3. Запишем десятичное вещественное число 3.56 в нормализованном виде. Выделим основание числа — оно равно 10 (десятичная система счисления). Выделим мантиссу числа — она равна. 3.56 (целая часть числа составляет одну-единственную цифру, не равную 0. Значит, точку никуда сдвигать не надо, само число и будет мантиссой). Выделим порядок основания. На какое число нужно умножить мантиссу, равную самому числу, чтобы она не изменилась? На единицу. Значит, порядок будет равен нулю. Итоговая запись числа в нормализованном виде — это 3.56 * 10º или 3.56Е0. 4. Хранение вещественных чисел в памяти компьютера: float и double. 4.1 Типы float и double. Приступаем к ключевому раздел нашей лекции. Как мы уже знаем, в Java есть два типа вещественных чисел: float и double. Тип float занимает в памяти компьютера 32 бита и может принимать значения в интервале [3.4E-38; 3.4E+38) (иными словами, в интервале от 3.4*10ˉ³⁸ (включительно) до 3.4 * 10³⁸ (исключая)). Важный нюанс 1. Числа типа float могут быть как положительными, так и отрицательными. Данный диапазон выше представлен для обозначения модулей чисел, входящих в диапазон float. Важный нюанс 2. 10³⁸ примерно равно 2¹²⁷, соответственно 10 ˉ³⁸ примерно равно 2ˉ¹²⁷. Таким образом, интервал модулей значений чисел float можно записать в виде [3.4 * 2ˉ¹²⁷; 3.4 * 2¹²⁷). Тип double занимает в два раза больше памяти компьютера — 64 бита и может принимать десятичные значения в интервале [-1.7E+308; 1.7E+308) соответственно. 4.2 Экспоненциальная нормализованная форма двоичных чисел. Мы знаем, что в памяти компьютера числа хранятся в двоичном виде. Итак, возьмем число 1560.256 (тип float) и переведем его в двоичную систему в позиционном виде: 11000011000.01000001100. Можно подумать, что именно так оно и будет храниться в памяти компьютера. Но это не так! В памяти компьютера типы float и double ( вещественные типы с плавающей точкой) хранятся в экспоненциальном нормализованном виде, но основанием степени выбрано число 2 вместо 10. Это связано с тем, что, как сказано выше, все данные в компьютере представлены в двоичной форме (битами). Под число отводится определённое количество компьютерной памяти. Представим положительное число 15.2 в нормализованном экспоненциальном виде: 1.52*10¹. Далее представим его двоичного «близнеца» 1111.00110011001 также в экспоненциальной нормализованной форме записи, пользуясь тем же самым алгоритмом: 1) Основание будет равно 2 2) Мантисса будет равна 1.11100110011001 3) Степень будет положительной и равна 3 (смещение точки на 3 бита влево) в десятичной системе. Переведем ее в двоичную систему: 11. Таким образом, в двоичном экспоненциальном нормализованном виде это будет число 1.11100110011001 * 2¹¹. 4.3 Хранение экспоненциальной нормализованной двоичной формы числа float в памяти компьютера. Итак, мы разобрались, что вещественное число будет храниться в памяти компьютера в экспоненциальной нормализованной двоичной форме. Как же оно будет выглядеть в памяти? Возьмем тип float. Под каждое число типа float компьютер выделяет 32 бита. Они распределяются следующим образом. На данном рисунке схематично представлена выделенная память для числа типа float размером в 32 бита в компьютере. НЕ ЧИТАТЬ ПОКА:))) Вещественные числа в памяти компьютера. НА ДОРАБОТКЕ. - 5Красным обозначена нумерация битов. Зеленым обозначен кусок выделенной памяти (1 бит) для хранения знака числа. Желтым обозначен кусок выделенной памяти для хранения смещенной степени (порядка) экспоненциальной формы числа (8 бит). Синим обозначен кусок выделенной памяти для хранения нормализованной мантиссы числа без неявной единицы(23 бита). Давайте разберемся подробнее. 1) Знаковый бит. Самый старший (первый слева) бит всегда выделяется под хранение знака числа (1, если число отрицательное, и 0, если число положительное). Исключение может составлять число ноль — в программировании ноль может быть и отрицательным, и положительным. 2) Далее идут биты степени (порядка) экспоненты с основанием 2. Для этого выделяют 8 бит. Степень экспоненты чисел float, как мы знаем, может быть и отрицательной (для чисел, целая часть которых равна 0, см. пункт 3.3), и положительной (для чисел, целая часть которых отлична от нуля) и лежит в пределах от 2ˉ¹²⁷ до 2¹²⁷ . По идее, мы должны выделить один бит на определение знака экспоненты, как в случае со знаковым битом. Но это не так. Чтобы не тратить бит на определение знака степени, у чисел float прибавляют смещение к экспоненте в половину байта +127(0111 1111). Таким образом, вместо диапазона степеней от 2ˉ¹²⁷ до 2¹²⁷, компьютер хранит диапазон степеней от 0 до +254 — все значения степеней положительны, лишний байт на знак тратить не надо. Получается, что величина показателя степени смещена наполовину относительно возможного значения. Это значит, что для получения фактического значения степени экспоненты необходимо вычесть это смещение из хранящегося в памяти значения. Если сохраненное в памяти значение степени экспоненты меньше смещения (+127), значит степень экспоненты отрицательная: это логично. Пример. Выполним смещение отрицательной степени -18. Прибавляем к ней смещение +127, получаем значение степени +119. Переведем степень в двоичный вид: 1110111 Но на степень же выделено 8 бит памяти, а тут мы получаем 7-ми битное число. На место пустого, незанятого старшего разряда (бита) компьютер добавляет 0. Итог данная степень будет храниться в памяти компьютера в виде 01110111. Смотрим: +119 < +127, значит, степень действительно по факту отрицательная. Рассмотрим следующую интересную таблицу: НЕ ЧИТАТЬ ПОКА:))) Вещественные числа в памяти компьютера. НА ДОРАБОТКЕ. - 11В ней приведены все возможные значения степеней нормализованных форм чисел float в двоичной и десятичной системах. Как мы видим, в двоичной системе +127 как раз составляет половину целого байта (8 бит). 3) Оставшиеся 23 бита отводят для мантиссы. Но у нормализованной двоичной мантиссы старший бит (он же целая часть нормализованной мантиссы) всегда равен 1 (называется неявная единица), так как число мантиссы лежит в диапазоне 1<=M<2 (а также вспоминаем пункт 2.1.1 лекции). Единственное исключение — число 0. Нет смысла записывать единицу в отведенные 23 бита и тратить память, поэтому в отведенные 23 бита записывают остаток от мантиссы (ее дробную часть). Выходит, что по сути значащая часть числа float имеет длину 24, из которых хранится на один бит меньше. Важный нюанс. Вспомним, что при переводе десятичных дробных чисел в двоичные часто дробная часть в двоичной системе получалась огромной. А у нас всего лишь 32 бита на хранение числа float. В данном случае самые младшие, малозначимые разряды двоичной дроби (вспоминаем пункт 2.1.2 данной лекции) не войдут в выделенную память и компьютер ими пренебрежет. Точность числа потеряется, но, согласитесь, минимально. Иными словами, точность дробных чисел типа float составляет 6-7 десятичных знаков. 4.4 Хранение экспоненциальной нормализованной двоичной формы числа double в памяти компьютера. Хранение вещественных чисел типа double осуществляется в памяти компьютера таким же образом, как и у чисел float, за исключением некоторых характеристик. На число типа double в памяти компьютера отведено 64 бита. Они распределяются следующим образом (также по порядку слева направо): 1) Знаковый бит (см. пункт 4.3). Мы понимаем, что номер этого бита будет 63. 2) Степень (порядок). На ее хранение у чисел double выделяется 11 бит. Также осуществляется смещение степени, но у чисел double оно будет равно +1023. 3) Мантисса (значащая часть). На ее хранение у чисел double выделяется 52 бита (разряда). Также точно целая часть мантиссы (неявная единица) в памяти не хранится. Также стоит отметить, что точность дробных чисел типа double составляет около 16 десятичных знаков. 4.5 Примеры представления вещественного числа десятичной системы в памяти компьютера. И завершающим пунктом нашей лекции будет пример перевода дробного числа десятичной системы счисления в форму его хранения в памяти компьютера для закрепления понимания темы. Пример 1. Возьмем число -4.25 типа float. Представим его в экспоненциальном нормализованном виде в двоичной системе счисления, вспоминая все, что проходили в этой лекции. 1) Переводим целую часть числа в двоичную форму: 4/2= 2 (остаток от деления 0) 2/2 = 1 (остаток от деления 0) Целая часть будет равна 100 в двоичной системе. 2)Переводим дробную часть числа в двоичную форму. 0.25*2 = 0.5 (0) 0.5*2 = 1.0 (1) Дробная часть будет равна 0.01 в двоичной системе. 3) Таким образом, -4.25₁₀ = -100.01₂. 4) Переведем число -100.01₂ в экспоненциальный нормализованный вид в двоичной системе счисления (значит, основание степени будет 2). -100.01₂ = -1.0001 *2² Переведем значение степени из десятичного формата в двоичный. 2/2=1 (остаток 0) Степень равна 10₂. Получаем, что число -4.25₁₀ в своей двоичной экспоненциальной нормализованной форме будет равно -1.0001 * 2¹º Запишем, как это будет выглядеть в памяти компьютера. Знаковый бит будет равен 1 (число отрицательное). Смещение экспоненты равно 2+127 = 129₁₀ = 10000001₂ У мантиссы откидываем неявную единицу, получаем 00010000000000000000000 ( незанятые младшие биты заполняем нулями). Итог. 1 10000001 00010000000000000000000 — вот таким образом число -4.25 хранится в памяти компьютера. Пример 2. Переведите число 0.75₁₀ типа float в двоичный формат хранения в памяти компьютера. Результат должен быть 0 01111110 10000000000000000000000. Благодарю за внимание.

Читать:
Как возводить 10 в отрицательную степень

Представление чисел в компьютере. Вещественные числа

В данный момент вы не можете посмотреть или раздать видеоурок ученикам

Чтобы получить доступ к этому и другим видеоурокам комплекта, вам нужно добавить его в личный кабинет.

Получите невероятные возможности

Конспект урока «Представление чисел в компьютере. Вещественные числа»

· представление вещественных чисел в компьютере;

· множество действительных чисел, представимых в памяти компьютера, дискретно, конечно и ограничено;

· форматы представления вещественных чисел.

Как вы помните из курса математики, вещественные числа – это более широкий круг чисел, появление которых возникло из необходимости измерения несоизмеримых величин. Например, для извлечения корня, вычисления логарифмов, решения уравнений, исследования функций и прочее.

Данное множество включает в себя кроме целых чисел ещё и рациональные и иррациональные числа.

Понятие вещественного числа прошло долгий путь определения и становления. Ещё в Древней Греции в школе Пифагора было открыто существование несоизмеримых величин – несоизмеримость стороны и диагонали квадрата – то есть было открыто наличие иррациональных чисел.

Классическое определение вещественным числам дал в восемнадцатом веке Исаак Ньютон.

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

Рассмотрим представление вещественных чисел в компьютере. Как вы помните, числа в компьютере представляются в двоичной системе счисления. Однако, в отличии от математики, множество вещественных чисел в компьютере – дискретно, ограничено и конечно. Опять же, как и в случае с целыми числами, из-за ограниченности размера ячейки памяти.

Из математики известно, что дробь

Здесь слово «бесконечная» означает, что в десятичной записи бесконечной десятичной дроби после запятой стоит бесконечное число десятичных знаков.

А слово «периодическая» означает, что это такая дробь, в которой бесконечно повторяется одна или несколько цифр. В нашем случае единица.

То есть обыкновенная дробь

Выполним деление на калькуляторе.

Итак, на табло калькулятора мы видим конечное число единиц после запятой.

Первый разряд отведён под знак числа. После запятой мы видим шестнадцать цифр, остальные не вместились в разрядную сетку. То есть мы получили не точное десятичное значение дроби одна девятая, а его сокращённое значение.

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

То есть можно сделать вывод: множество вещественных чисел, представимых в калькуляторе, дискретно, потому что числа отделены друг от друга конечными отрезками.

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

То есть мы получили число, которое больше предыдущего числа в тысячу раз. Как и в прошлый раз, наше число будет обрезанное.

Обратите внимание, шаг числовой последовательности изменится. Он, по сравнению с предыдущем примером, увеличится в тысячу раз.

То есть можно сделать вывод: множество вещественных чисел, представимых в калькуляторе, дискретно с переменной величиной шага между соседними числами.

Отметим на числовой прямой точные значения вещественных чисел, которые можно представить на калькуляторе. Как видим, точки будут размещаться неравномерно: ближе к нулю – чаще, дальше от нуля – реже.

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

В компьютере также, вещественные числа расположены неравномерно.

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

То есть самое большое число на разных калькуляторах будет различным. Так на самом простом калькуляторе, самое большое вещественное число будет 999999999. Если увеличить это число на единицу, то калькулятор выдаст сообщение об ошибке. На другом же калькуляторе, более усовершенствованном, самое большое число будет больше и если прибавить единицу, то вы получите следующий результат:

Для нас такая запись означает: единица, умноженная на десять в шестнадцатой степени.

Данный формат записи числа называют форматом с плавающей запятой, ранее мы рассматривали примеры только с фиксированной запятой.

Число, стоящее перед буквой е, называют мантиссой, число, стоящее после — порядком. Буква Е – это основание десятичной системы счисления.

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

Например, число 25324 можно представить различными способами

Рассмотрим представление 0,25324 • 10 5

Здесь мантисса m = 0,25324, а n = 5 – порядок.

Порядок указывает, на какое количество позиций и в каком направлении должна сместится десятичная запятая в мантиссе.

Мантисса числа для однозначности представления чисел с плавающей запятой должна иметь нормализованную форму, а именно представлять собой правильную дробь с цифрой после запятой, отличной от нуля;

Рассмотрим примеры нормализованного представления чисел.

Числа в компьютере могут представляться в формате как с фиксированной запятой, это, как правило, целые числа, так и в формате с плавающей запятой.

Но важно понимать, что и для числа, записанного в формате с плавающей запятой всегда есть ограничение – есть определённое самое большое число. Для нашего калькулятора это число

Положительные и отрицательные числа расположены симметрично относительно нуля. Следовательно, максимальное и минимальное числа равны между собой по модулю.

Эти числа являются целыми, но именно они ограничивают представление всех чисел: и целых, и вещественных, на калькуляторе.

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

Вещественное число может занимать в памяти компьютера 32 или 64 разряда. То есть наша ячейка в памяти может состоять из 32 или 64 клеточек. При этом выделяются разряды для хранения знака мантиссы, знака порядка, порядка и мантиссы.

Давайте разберёмся на примере. Возьмём число 125 в десятичной системе счисления и запишем её в 32-разрядную ячейку.

Мы записали двоичное число в экспоненциальной форме.

Теперь перенесём всё в клеточки ячейки памяти, размером 32 разряда.

Под знак и порядок выделяется 8 клеточек, под знак и мантиссу 24.

Первую клеточку слева выделяем под знак. Так как наше число положительное, то ставим цифру ноль. В разделе Знак и порядок запишем число семь в двоичной системе счисления. Оставшиеся клеточки заполним нулями.

Теперь переходим к разделу Знак и мантисса. В первой слева снова ставим цифру ноль, которая обозначает, что число положительное. Далее запишем наше число, а оставшиеся клеточки заполним нулями.

Мы записали наше число в тридцатидвухразрядную ячейку.

Диапазон представления вещественных чисел определяется количеством разрядов, отведённых для хранения порядка чисел, а точность – количеством разрядов, отведённых для хранения мантиссы.

Диапазон вещественных чисел ограничен, но он значительно шире, чем при представление целых чисел в форме с фиксированной запятой.

Например, при использовании 32-разрядной ячейки этот диапазон следующий:

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

вещественные числа в компьютере представляются в формате с плавающей запятой.

всякое вещественное число X записывается в виде произведения мантиссы m и основания системы счисления q в некоторой целой степени n, которую называют порядком.

Нормализованной формой числа с плавающей запятой называется правильная дробь с цифрой после запятой, отличной от нуля.

Диапазон представления вещественных чисел определяется количеством разрядов, отведённых для хранения порядка чисел, а точность – количеством разрядов, отведённых для хранения мантиссы.

Представление вещественных чисел

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

Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые знак (англ. sign), порядок (англ. exponent) и мантиссу (англ. mantis). В наиболее распространённом формате (стандарт IEEE 754) число с плавающей запятой представляется в виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и ещё один бит используется для указания знака числа ( [math]0[/math] — если число положительное, [math]1[/math] — если число отрицательное). При этом порядок записывается как целое число в коде со сдвигом, а мантисса — в нормализованном виде, своей дробной частью в двоичной системе счисления. Вот пример такого числа из [math]16[/math] двоичных разрядов:

Знак
Порядок Мантисса
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
14 10 9 0

Знак — один бит, указывающий знак всего числа с плавающей точкой. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:

[math](-1)^S \times M \times B^E[/math] , где [math]S[/math] — знак, [math]B[/math] — основание, [math]E[/math] — порядок, а [math]M[/math] — мантисса. Десятичное число, записываемое как [math] ReE[/math] , где [math]R[/math] — число в полуинтервале [math][1; 10)[/math] , [math]E[/math] — степень, в которой стоит множитель [math]10[/math] ; в нормализированной форме модуль [math]R[/math] будет являться мантиссой, а [math]E[/math] — порядком, а [math]S[/math] будет равно [math]1[/math] тогда и только тогда, когда [math]R[/math] принимает отрицательное значение. Например, в числе [math]-2435e9[/math]

  • [math]S[/math] [math]=[/math] [math]1[/math]
  • [math]B[/math] [math]=[/math] [math]10[/math]
  • [math]M[/math] [math]=[/math] [math]2435[/math]
  • [math]E[/math] [math]=[/math] [math]9[/math]

Порядок также иногда называют экспонентой или просто показателем степени.

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

Более простым вариантом представления вещественных чисел является вариант с фиксированной точкой, когда целая и вещественная части хранятся отдельно. Например, на целую часть отводится всегда [math]X[/math] бит и на дробную отводится всегда [math]Y[/math] бит. Такой способ в архитектурах процессоров не присутствует. Отдаётся предпочтение числам с плавающей запятой, как компромиссу между диапазоном допустимых значений и точностью.

Содержание

Нормальная и нормализованная форма

Нормальной формой (англ. normal form) числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [math][0; 1)[/math] . Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, [math]0<,>0001[/math] можно записать в 4 формах — [math]0<,>0001 \times 10[/math] [math]0[/math] , [math]0<,>001 \times 10[/math] [math]−1[/math] , [math]0<,>01 \times 10[/math] [math]−2[/math] , [math]0<,>1 \times 10[/math] [math]−3[/math] ), поэтому распространена также другая форма записи — нормализованная (англ. normalized), в которой мантисса десятичного числа принимает значения от [math]1[/math] (включительно) до [math]10[/math] (не включительно), а мантисса двоичного числа принимает значения от [math]1[/math] (включительно) до [math]2[/math] (не включительно). То есть в мантиссе слева от запятой до применения порядка находится ровно один знак. В такой форме любое число (кроме [math]0[/math] ) записывается единственным образом. Ноль же представить таким образом невозможно, поэтому стандарт предусматривает специальную последовательность битов для задания числа [math]0[/math] (а заодно и некоторых других полезных чисел, таких как [math]-\infty[/math] и [math]+\infty[/math] ). Так как старший двоичный разряд (целая часть) мантиссы вещественного числа в нормализованном виде всегда равен « [math]1[/math] », то его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем [math]2[/math] (в троичной, четверичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).

Типы чисел с плавающей точкой (по IEEE 754)

Число половинной точности (Binary16, Half precision)

Число́ полови́нной то́чности — компьютерный формат представления чисел, занимающий в памяти половину машинного слова (в случае 32-битного компьютера — [math]16[/math] бит или [math]2[/math] байта). В силу невысокой точности этот формат представления чисел с плавающей запятой обычно используется в видеокартах, где небольшой размер и высокая скорость работы важнее точности вычислений.

Знак
Порядок Мантисса
0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0
14 10 9 0

Порядок записан со сдвигом [math]-15[/math] . То есть чтобы получить актуально значение порядка нужно вычесть из него сдвиг. Сдвиг можно получить по формуле [math]2^-1[/math] , где [math]b[/math] — число бит, отведенное на хранение порядка (в случае числа половинной точности [math]b=5[/math] ).

Ограничения точности

  • Целые от нуля до [math]2048[/math] передаются как есть.
  • Целые от [math]2049[/math] до [math]4096[/math] округляются к ближайшему чётному целому.
  • Целые от [math]4097[/math] до [math]8192[/math] округляются до ближайшего целого, делящегося нацело на четыре.
  • Целые от [math]8193[/math] до [math]16384[/math] округляются до ближайшего целого, делящегося на восемь.
  • Целые от [math]16385[/math] до [math]32768[/math] округляются до ближайшего целого, делящегося на шестнадцать.
  • Целые от [math]32769[/math] до [math]65535[/math] округляются до ближайшего целого, делящегося на тридцать два.

Число одинарной точности (Binary32, Single precision, float)

Число́ одина́рной то́чности — компьютерный формат представления чисел, занимающий в памяти одно машинное слово (в случае 32-битного компьютера — [math]32[/math] бита или [math]4[/math] байта). Используется для работы с вещественными числами везде, где не нужна очень высокая точность.

Знак
Порядок (8 бит) Мантисса (23+1 бита)
0 0 0 0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
30 23 22 0

Порядок записан со сдвигом [math]-127[/math] .

Число двойной точности (Binary64, Double precision, double)

Число́ двойно́й то́чности — компьютерный формат представления чисел, занимающий в памяти два машинных слова (в случае 32-битного компьютера — [math]64[/math] бита или [math]8[/math] байт). Часто используется благодаря своей неплохой точности, даже несмотря на двойной расход памяти и сетевого трафика относительно чисел одинарной точности.

Знак
Порядок
(11 бит)
Мантисса
(52+1 бит)
0 0 0 0 0 0 0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
62 52 51 0

Порядок записан со сдвигом [math]-1023[/math] .

Число четверной точности (Binary128, Quadruple precision)

Число́ четверно́й то́чности — компьютерный формат представления чисел, занимающий в памяти четыре машинных слова (в случае 32-битного компьютера — [math]128[/math] бит или [math]16[/math] байт). Используется в случае необходимости крайне высокой точности.

Знак
Порядок
(15 бит)
Мантисса
(112+1 бит)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
126 112 111
Мантисса
(112+1 бит)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0

Порядок записан со сдвигом [math]-16383[/math] .

Обычно этот формат реализуется программно, случаи аппаратной реализации крайне редки. Также не гарантируется поддержка этого типа в языках программирования, хотя кое-где она и реализована (например, компилятор gcc для архитектуры x86 позволяет использовать тип __float128, являющийся программной реализацией числа с четверной точностью). В совокупности эти факторы делают Quadruple весьма экзотичным и редко встречающимся форматом чисел с плавающей запятой.

Диапазон значений чисел с плавающей запятой

Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя (когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number, «не число», получается как результат операций типа деления нуля на ноль) и [math]\pm\infty[/math] .

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

Название в IEEE 754 Название типа переменной в Си Диапазон значений Бит в мантиссе Бит на переменную
Half precision 6,10×10 -5 ..65504 11 16
Single presicion float -3,4×10 38 ..3,4×10 38 23 32
Double precision double -1,7×10 308 ..1,7×10 308 53 64
Extended precision На некоторых архитектурах (например в сопроцессоре Intel) long double -3,4×10 4932 ..3,4×10 4932 65 80

Особые значения чисел с плавающей точкой

Ноль (со знаком)

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

Знак
Порядок Мантисса
0 /1 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0  =  [math]\pm0[/math]
14 10 9 0

Арифметика нуля со знаком
Арифметика отрицательного нуля аналогична таковой для любого отрицательного числа и понятна интуитивно. Вот несколько примеров:

  • [math]\frac<-0>< \left| x \right| >= -0\,\![/math] (если [math]x\ne0[/math] )
  • [math](-0) \cdot (-0) = +0\,\![/math]
  • [math]\left| x \right| \cdot (-0) = -0\,\![/math]
  • [math]x + (\pm 0) = x\,\![/math]
  • [math](-0) + (-0) = -0\,\![/math]
  • [math](+0) + (+0) = +0\,\![/math]
  • [math]\frac<-0><-\infty>= +0\,\![/math]
  • [math]\frac<\left|x\right|><-0>= -\infty\,\![/math] (если [math]x\ne0[/math] )

Неопределенность (NaN)

NaN — это аббревиатура от фразы «not a number«. NaN является результатом арифметических операций, если во время их выполнения произошла ошибка (примеры см. ниже). В IEEE 754 NaN представлен как число, в котором все двоичные разряды порядка — единицы, а мантисса не нулевая.

Знак
Порядок Мантисса
0 /1 1 1 1 1 1 1, 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1  =  [math]NaN[/math]
14 10 9 0

Любая операция с NaN возвращает NaN. При желании в мантиссу можно записывать информацию, которую программа сможет интерпретировать. Стандартом это не оговорено и мантисса чаще всего игнорируется.

Как можно получить NaN?

  • [math]\infty+(-\infty)= NaN[/math]
  • [math]0\times\infty= NaN[/math]
  • [math]\frac<\pm0><\pm0>= NaN[/math]
  • [math]\frac<\pm\infty><\pm\infty>= NaN[/math]
  • [math]\sqrt = NaN[/math] , где [math]x\lt 0[/math]

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

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

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

В число с плавающей запятой можно записать значение [math]+\infty[/math] или [math]-\infty[/math] . Как и нули со знаком, бесконечности позволяют получить хотя бы близкий к правильному результат вычисления в случае переполнения. Согласно стандарту IEEE 754 число с плавающей запятой считается равным бесконечности, если все двоичные разряды его порядка — единицы, а мантисса равна нулю. Знак бесконечности определяется знаковым битом числа.

Знак
Порядок Мантисса
0 /1 1 1 1 1 1 1, 0 0 0 0 0 0 0 0 0 0  =  [math]\pm\infty[/math]
14 10 9 0

Получить бесконечность можно при переполнении и при делении ненулевого числа на ноль. При этом [math] \frac <0>[/math] [math]= \begin +\infty,&\text<если $x\gt 0$;>\\ NaN,&\text<если $x=0$;>\\ -\infty,&\text <если $x\lt 0$.>\end [/math]

Денормализованные числа

Денормализованные числа (англ. denormalized/subnormal numbers) — это способ увеличить количество представимых числом с плавающей запятой значений около нуля, дабы повысить точность вычислений. Каждое значение денормализованного числа меньше самого маленького нормализованного («обычного») значения числа с плавающей запятой. Согласно стандарту, если порядок равен своему минимальному значению (все его биты — нули, а истинное значение порядка равно его сдвигу) и все биты мантиссы равны нулю, то это [math]\pm0[/math] . Если же мантисса не равна нулю, то это число с порядком, на единицу большим минимального (все биты порядка, кроме младшего — нули) и данной мантиссой, целая часть которой считается равной нулю, а не единице.

То есть число с плавающей запятой, при учете вышесказанного, можно задать следующим образом:

  • [math](-1)^s\times1,M\times2^E[/math] , если [math]E_ \le E \le E_[/math] (нормализованное число)
  • [math](-1)^s\times0,M\times2^>[/math] , если [math]E=E_-1[/math] (денормализованное число)

Где [math]s[/math] — бит знака, [math]M[/math] — последовательность битов мантиссы, [math]E[/math] — значение порядка (с учетом сдвига), [math]E_[/math] — минимальное значение порядка, используемое для записи чисел (1 — сдвиг) , [math]E_-1[/math] — минимальное значение порядка, которое он в принципе может принять (все биты нули, 0 — сдвиг).

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

В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел. Ниже приведена часть таблицы из статьи Isaac Dooley, Laxmikant Kale «Quantifying the Interference Caused by Subnormal Floating-Point Values» [1]

Производитель Процессор Замедление (разы)
IBM PowerPC 970 2,4
AMD Athlon 6,0
Intel Pentium 3 15,8
AMD Athlon 64 21,4
AMD Opteron64 23,8
Intel Core Duo 44,2
Intel P4 Xeon 97,9
Intel Pentium 4 131,0
Intel Itanium 2 183,2
Sun UltraSPARC IV 520,0

В таблице приведены наихудшие результаты тестирования среди всех использованных компиляторов (gcc, icc, xlc) со всеми доступными флагами оптимизации. Исследователи утверждают, что различие среднего случая с худшим незначительно.

Поскольку в стандартных форматах (одинарной и двойной точности) денормализованные числа получаются действительно очень маленькими и практически никак не влияют на результат некоторых вычислений (при этом заметно замедляя их скорость), то иногда они просто игнорируются. При этом используются два простых механизма, получивших называние Flush-to-zero (FTZ) и Denormals-are-zero (DAZ). Первый механизм заставляет операции возвращать ноль, как только становится ясно, что результат будет денормализованным. Второй механизм заставляет операции рассматривать поступающие на вход денормализованные числа как нули.
Ярким примером подобного «отсечения» денормализованных чисел могут послужить видеокарты, в которых резкое падение скорости вычислений в сотню раз недопустимо. Так же, например, в областях, связанных с обработкой звука, нет нужды в очень маленьких числах, поскольку они представляют столь тихий звук, что его не способно воспринять человеческое ухо.

В версии стандарта IEEE 754-2008 денормализованные числа (denormal или denormalized numbers) были переименованы в subnormal numbers, то есть в числа, меньшие «нормальных». Поэтому их иногда еще называют «субнормальными«.

Действия с числами с плавающей запятой

Умножение и деление

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

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

Сложение и вычитание

Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме. Пример:

Алгоритм получения представления вещественного числа в памяти ЭВМ

Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.

Как видно из таблицы, величина этого типа занимает в памяти [math]8[/math] байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):

Знак Смещённый порядок Мантисса
63 62..52 51..0

Можно заметить, что старший бит, отведенный под мантиссу, имеет номер [math]51[/math] , т.е. мантисса занимает младшие [math]52[/math] бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна [math]1[/math] , здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает [math]11[/math] бит и имеет диапазон от [math]2[/math] [math]-1023[/math] до [math]2[/math] [math]1023[/math] , поэтому смещение равно [math]1023[/math] ( [math]10[/math] ) [math]=[/math] [math]1111111111[/math] ( [math]2[/math] ). Наконец, бит с номером [math]63[/math] указывает на знак числа.

Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:

  1. перевести модуль данного числа в двоичную систему счисления;
  2. нормализовать двоичное число, т.е. записать в виде M [math] \times [/math] 2 p , где M &#151; мантисса (ее целая часть равна [math]1[/math] ( [math]2[/math] )) и p &#151; порядок, записанный в десятичной системе счисления;
  3. прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
  4. учитывая знак заданного числа (0 &#151; положительное; 1 &#151; отрицательное), выписать его представление в памяти ЭВМ.

Пример. Запишем код числа [math]-312[/math] , [math]3125[/math] .

  1. Двоичная запись модуля этого числа имеет вид [math]100111000<,>0101[/math] .
  2. Имеем [math]100111000<,>0101[/math] [math]=[/math] [math]1<,>001110000101[/math] [math]\times[/math] [math]2[/math] [math]8[/math] .
  3. Получаем смещенный порядок [math]8[/math] [math]+[/math] [math]1023[/math] [math]=[/math] [math]1031[/math] . Далее имеем [math]1031[/math] ( [math]10[/math] ) [math]=[/math] [math]10000000111[/math] ( [math]2[/math] ).
  4. Окончательно
    1 10000000111 0011100001010000000000000000000000000000000000000000
    63 62..52 51..0

Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).

Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.

Похожие статьи