Изменения

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

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

5845 байт добавлено, 05:17, 1 ноября 2010
Нет описания правки
Мантисса: 112
 
=== Алгоритм получения представления вещественного числа в памяти ЭВМ ===
 
<P>Покажем преобразование действительного числа для представления его в
 
памяти ЭВМ на примере величины типа Double.</P>
 
<P>Как видно из таблицы, величина это типа занимает в памяти 8 байт. На
 
рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):</P>
 
<center>
 
<table border=1 CellSpacing="0" CellPadding="2">
 
<tr><td>S</td><td>Смещенный порядок</td><td>Мантисса</td></tr>
 
<tr><td>63</td><td>62..52</td><td>51..0</td></tr>
 
</table>
 
</center>
 
<P>Можно заметить, что старший бит, отведенный под мантиссу, имеет номер
 
51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на
 
положение двоичной запятой. Перед запятой должен стоять бит целой части
 
мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и
 
соответствующий разряд отсутствует в памяти (но он подразумевается).
 
Значение порядка хранится здесь не как целое число, представленное в
 
дополнительном коде. Для упрощения вычислений и сравнения действительных
 
чисел значение порядка в ЭВМ хранится в виде <strong>смещенного числа</strong>, т.е. к
 
настоящему значению порядка перед записью его в память прибавляется
 
смещение. Смещение выбирается так, чтобы минимальному значению порядка
 
соответствовал нуль. Например, для типа Double порядок занимает 11 бит и
 
имеет диапазон от 2<sup>-1023</sup> до 2<sup>1023</sup>, поэтому смещение равно 1023<sub>(10)</sub> =
 
1111111111<sub>(2)</sub>. Наконец, бит с номером 63 указывает на знак числа.</P>
 
<P>Таким образом, из вышесказанного вытекает следующий <strong>алгоритм</strong> для
 
получения представления действительного числа в памяти ЭВМ:</P>
 
<OL>
 
<LI>перевести модуль данного числа в двоичную систему счисления;</LI>
 
<LI>нормализовать двоичное число, т.е. записать в виде <I>M</I>&nbsp;&times;&nbsp;2<I><sup>p</sup></I>, где <I>M</I>&nbsp;&#151;
 
мантисса (ее целая часть равна 1<sub>(2)</sub>) и <I>p</I>&nbsp;&#151; порядок, записанный в
 
десятичной системе счисления;</LI>
 
<LI>прибавить к порядку смещение и перевести смещенный порядок в двоичную
 
систему счисления;</LI>
 
<LI>учитывая знак заданного числа (0&nbsp;&#151; положительное; 1&nbsp;&#151; отрицательное),
 
выписать его представление в памяти ЭВМ.</LI>
 
</OL>
 
<P><B>Пример.</B> Запишем код числа -312,3125.</P>
 
<OL>
 
<LI>Двоичная запись модуля этого числа имеет вид 100111000,0101.</LI>
 
<LI>Имеем 100111000,0101 =
 
1,001110000101&nbsp;&times;&nbsp;2<sup>8</sup>.</LI>
 
<LI>Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем
 
1031<sub>(10)</sub> = 10000000111<sub>(2)</sub>.</LI>
 
<LI>Окончательно
 
<center>
 
<table border=1 CellSpacing="0" CellPadding="2">
 
<tr><td>1</td><td>10000000111</td><td>0011100001010000000000000000000000000000000000000000</td></tr>
 
<tr><td>63</td><td>62..52</td><td>51..0</td></tr>
 
</table>
 
</center>
 
</LI>
 
</OL>
 
<P>Очевидно, что более компактно полученный код стоит записать следующим
 
образом: C073850000000000<sub>(16)</sub>.</P>
 
<P>Другой пример иллюстрирует обратный переход от кода действительного
 
числа к самому числу.</P>
 
<P><B>Пример.</B> Пусть дан код 3FEC600000000000<sub>(16)</sub> или
 
<center>
 
<table border=1 CellSpacing="0" CellPadding="2">
 
<tr><td>0</td><td>01111111110</td><td>1100011000000000000000000000000000000000000000000000</td></tr>
 
<tr><td>63</td><td>62..52</td><td>51..0</td></tr>
 
</table>
 
</center>
 
<OL>
 
<LI>Прежде всего замечаем, что это код положительного числа, поскольку в
 
разряде с номером 63 записан нуль. Получим порядок этого числа:
 
01111111110<sub>(2)</sub> = 1022<sub>(10)</sub>; 1022 - 1023 = -1.</LI>
 
<LI>Число имеет вид 1,1100011&nbsp;&times;&nbsp;2<sup>-1</sup> или
 
0,11100011.</LI>
 
<LI>Переводом в десятичную систему счисления получаем 0,88671875.</LI>
 
</OL>
 
===Cсылки===
*[http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8 http://ru.wikipedia.org/wiki/Число_двойной_точности]
*[http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%87%D0%B5%D1%82%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8 http://ru.wikipedia.org/wiki/Число_четверной_точности]
*[http://comp-science.narod.ru/Cod/cod.html http://comp-science.narod.ru/Cod/cod.html]
419
правок

Навигация