Изменения

Перейти к: навигация, поиск

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

265 байт добавлено, 20:38, 12 января 2015
м
Нет описания правки
Вещественные числа обычно представляются в виде чисел с плавающей запятой. Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений, его можно считать аналогом экспоненциальной записи чисел, но только в памяти компьютера.
Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые '''знак''' ('''sign'''), '''порядок''' ('''exponent''') и '''мантиссу''' ('''mantis'''). В наиболее распространённом формате (стандарт IEEE 754) число с плавающей запятой представляется в виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и ещё один бит используется для указания знака числа (<tex>0</tex> {{---}} если число положительное, <tex>1</tex> {{---}} если число отрицательное). При этом порядок записывается как целое число в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|коде со сдвигом]], а мантисса {{---}} в [[#Нормальная и нормализованная форма|нормализованном виде]], своей дробной частью в двоичной системе счисления. Вот пример такого числа из <tex>16</tex> двоичных разрядов:
{|class="wikitable" style="border-collapse: collapse; border: none"
|-
Знак {{---}} один бит, указывающий знак всего числа с плавающей точкой. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:
<tex>(-1)^S \times M \times B^E</tex>, где <tex>S </tex> {{---}} знак, <tex>B </tex> {{---}} основание, <tex>E </tex> {{---}} порядок, а <tex>M </tex> {{---}} мантисса.Десятичное число, записываемое как <tex> ReE</tex>, где <tex>R </tex> {{---}} число в интервале полуинтервале <tex>[1; 10)</tex>, E {{---}} степень, в которой стоит множитель <tex>10</tex>;В нормализированной форме модуль <tex>R </tex> будет являться мантиссой, а <tex>E </tex> {{---}} порядком, а <tex>S </tex> будет равно <tex>1</tex> тогда и только тогда, когда R < <tex>0R</tex>принимает отрицательное значение.
Например, в числе <tex>-2435e9</tex>
* <tex>S </tex> = <tex>1</tex>* <tex>B </tex> = <tex>10</tex>* <tex>M </tex> = <tex>2435</tex>* <tex>E </tex> = <tex>9</tex>
Порядок также иногда называют '''экспонентой''' или просто '''показателем степени'''.
== Нормальная и нормализованная форма ==
'''Нормальной формой''' (''normal form'') числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале <tex>[0; 1)</tex>. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, <tex>0,0001</tex> можно записать в 4 формах — <tex>0,0001</tex>×<tex>10</tex><sup><tex>0</tex></sup>, <tex>0,001</tex>×<tex>10</tex><sup><tex>−1</tex></sup>, <tex>0,01</tex>×<tex>10</tex><sup><tex>−2</tex></sup>, <tex>0,1</tex>×<tex>10</tex><sup><tex>−3</tex></sup>), поэтому распространена также другая форма записи — '''нормализованная''' (''normalized''), в которой мантисса десятичного числа принимает значения от <tex>1</tex> (включительно) до <tex>10</tex> (не включительно), а мантисса двоичного числа принимает значения от <tex>1</tex> (включительно) до <tex>2</tex> (не включительно). То есть в мантиссе слева от запятой до применения порядка находится ровно один знак. В такой форме любое число (кроме <tex>0</tex>) записывается единственным образом. Ноль же представить таким образом невозможно, поэтому стандарт предусматривает специальную последовательность битов для задания числа <tex>0</tex> (а заодно и некоторых других [[#Особые значения чисел с плавающей точкой|полезных чисел]], таких как <tex>-\infty</tex> и <tex>+\infty</tex>).
Так как старший двоичный разряд (целая часть) мантиссы вещественного числа в нормализованном виде всегда равен «<tex>1</tex>», то его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем <tex>2</tex> (в троичной, четверичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).
Нормализуем полученное двоичное число по правилам машинной арифметики.
<tex>-100001101{,}00111</tex> = <tex>-1{,}0000110100111</tex> &times; <tex>10</tex><sup><tex>1000</tex></sup>
Найдем смещенный порядок. Так как в условии говорится о 32-разрядном представлении, то смещение порядка равно <tex>127</tex><sub><tex>10</tex></sub>.
памяти ЭВМ на примере величины типа Double.</P>
<P>Как видно из таблицы, величина это этого типа занимает в памяти <tex>8</tex> байт. На
рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):</P>
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]
== Примечания ==
[http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf Статья Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values"]
== Ссылки ==
=== Использованные материалы ===
'''На русском'''
* [http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C Википедия {{- --}} Экспоненциальная запись]* [http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D0%BE%D0%B9 Википедия {{--- }} Число с плавающей запятой]* [http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%80%D0%B8%D1%86%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B8_%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BB%D1%8C Википедия {{--- }} Отрицательный и положительный ноль]*[http://habrahabr.ru/blogs/cpp/112953/ Хабрахабр {{--- }} статья пользователя Yruslan "Что нужно знать про арифметику с плавающей запятой"]
*[http://www.sgu.ru/prcnit/teach/3.php Статья Лапшевой Е.Е. "Машинная арифметика с вещественными числами"]
'''На английском'''
*[http://en.wikipedia.org/wiki/NaN Wikipedia {{- --}} NaN]*[http://en.wikipedia.org/wiki/Floating_point Wikipedia {{--- }} Floating point]*[http://en.wikipedia.org/wiki/IEEE_754-2008 Wikipedia {{--- }} IEEE 754-2008]
=== Что стоит прочесть ===
== Примечания ==
[http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf Статья Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values"]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Представление информации]]

Навигация