Изменения

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

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

19 байт добавлено, 18:20, 23 июня 2020
Сложение и вычитание
== Нормальная и нормализованная форма ==
'''Нормальной формой''' (англ. ''normal form'') числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале <tex>[0; 1)</tex>. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, <tex>0{,}0001</tex> можно записать в 4 формах — <tex>0{,}0001</tex> \times <tex>10</tex><sup><tex>0</tex></sup>, <tex>0{,}001</tex> \times <tex>10</tex><sup><tex>−1</tex></sup>, <tex>0{,}01</tex> \times <tex>10</tex><sup><tex>−2</tex></sup>, <tex>0{,}1</tex> \times <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> (в троичной, четверичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).
 
== Типы чисел с плавающей точкой (по IEEE 754) ==
|Half precision||-||6,10&times;10<sup>-5</sup>..65504||11||16
|-
|Single presicion||float||-3,4&times;10<sup>-38</sup>..3,4&times;10<sup>38</sup>||23||32
|-
|Double precision||double||-1,7&times;10<sup>-308</sup>..1,7&times;10<sup>308</sup>||53||64
|-
|Extended precision||На некоторых архитектурах (например в сопроцессоре Intel) long double||-3,4&times;10<sup>-4932</sup>..3,4&times;10<sup>4932||65||80
|}
* <tex>0\times\infty= NaN</tex>
* <tex>\frac{\pm0}{\pm0}=NaN</tex> * <tex>\frac{\pm\infty}{\pm\infty} = NaN</tex>
* <tex>\sqrt{x} = NaN</tex>, где <tex>x<0</tex>
Нормализуем полученное двоичное число по правилам машинной арифметики.
<tex>-100001101{,}00111</tex> <tex>=</tex> <tex>-1{,}0000110100111</tex><tex> &\times;</tex> <tex>10</tex><sup><tex>10008</tex></sup>
Найдем смещенный порядок. Так как в условии говорится о 32-разрядном представлении, то смещение порядка равно <tex>127</tex><sub><tex>10</tex></sub>.
Переведем второе число в машинный вид, совершая те же действия.
<tex>405,87510</tex> = <tex>110010101</tex>,<tex>111000000000011010</tex>...<sub><tex>2</tex></sub> <tex>=</tex> <tex>1,10010101111000000000011010</tex>... &<tex>\times; </tex> <tex>10</tex><sup><tex>1000</tex></sup>
В качестве мантиссы будут сохранены первые <tex>23</tex> бита после запятой т.е. <tex>10010101111000000000011</tex>.
Очевидно, что порядок со смещением у второго числа будет таким же, как и у первого.
Следовательно, число результата будет иметь вид:
<tex>A</tex> <tex>=</tex> <tex>1{,}000100010101</tex> <tex>&\times;</tex> <tex>10</tex><sup><tex>111</tex></sup> <tex>=</tex> <tex>10001000</tex>,<tex>10101</tex><sub><tex>2</tex></sub> <tex>=</tex> <tex>136{,}65625</tex><sub><tex>10</tex></sub>
Результат наших вычислений верен, так как <tex>405{,}875</tex> - <tex>269{,}21875</tex> <tex>=</tex> <tex>136{,}65625</tex>.
<LI>перевести модуль данного числа в двоичную систему счисления;</LI>
<LI>нормализовать двоичное число, т.е. записать в виде <I>M</I>&nbsp;&<tex> \times;&nbsp;</tex>2<I><sup>p</sup></I>, где <I>M</I>&nbsp;&#151;
мантисса (ее целая часть равна <tex>1</tex><sub>(<tex>2</tex>)</sub>) и <I>p</I>&nbsp;&#151; порядок, записанный в
<OL>
<LI>Двоичная запись модуля этого числа имеет вид <tex>100111000</tex>{,<tex>}0101</tex>.</LI>
<LI>Имеем <tex>100111000{,}0101</tex> <tex>=</tex>
<tex>1{,}001110000101</tex><tex>&nbsp;&\times;&nbsp;</tex><tex>2</tex><sup><tex>8</tex></sup>.</LI>
<LI>Получаем смещенный порядок <tex>8</tex> <tex>+</tex> <tex>1023</tex> <tex>=</tex> <tex>1031</tex>. Далее имеем
<tex>01111111110</tex><sub>(<tex>2</tex>)</sub> <tex>=</tex> <tex>1022</tex><sub>(<tex>10</tex>)</sub>; <tex>1022</tex> <tex>-</tex> <tex>1023</tex> <tex>=</tex> <tex>-1</tex>.</LI>
<LI>Число имеет вид <tex>1</tex>,<tex>1100011</tex>&nbsp;&<tex> \times;&nbsp;</tex><tex>2</tex><sup><tex>-1</tex></sup> или
<tex>0</tex>,<tex>11100011</tex>.</LI>
* [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 Статья Лапшевой Е.Е. "Машинная арифметика с вещественными числами"]<span style="color: red">Статья удалена</span>
'''На английском'''
Анонимный участник

Навигация