Изменения

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

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

5204 байта добавлено, 22:10, 19 октября 2011
Добавил информацию о представлении нуля
=== Нормальная форма и ''нормализованная '' форма ===
'''Нормальной формой''' числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [0; 1). Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать в 4 формах — 0,0001×10<sup>0</sup>, 0,001×10<sup>−1</sup>, 0,01×10<sup>−2</sup>, 0,1×10<sup>−3</sup>), поэтому распространена также другая форма записи — '''нормализованная''', в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (не включительно), а мантисса двоичного числа принимает значения от 1 (включительно) до 2 (не включительно). То есть в мантиссе слева от запятой до применения порядка находится ровно один знак. В такой форме любое число (кроме 0) записывается единственным образом. Ноль же представить таким образом невозможно, поэтому стандарт предусматривает специальную последовательность битов для задания числа 0 (а заодно и некоторых других полезных чисел, таких как <tex>-\infty</tex> и <tex>+\infty</tex>).
|colspan=5 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
 
=== Диапазон чисел, представимых в формате с плавающей запятой ===
Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя (когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number, "не число", получается как результат операций типа деления нуля на ноль) и <tex>\pm\infty</tex>.
 
<center>
 
<table border=1 CellSpacing="0" CellPadding="2">
 
<tr><th>Название (IEEE 754)</th><th>Тип (C)</th><th>Диапазон</th><th>Биты мантиссы</th><th>Биты</th></tr>
 
<tr><td>Half precision</td><td>Нет</td><td>6,10&times;10<sup>-5</sup>..65504</td><td>10+1</td><td>16</td></tr>
 
<tr><td>Single precision</td><td>float</td><td>3,4&times;10<sup>-38</sup>..3,4&times;10<sup>38</sup></td><td>23+1</td><td>32</td></tr>
 
<tr><td>Double precision</td><td>double</td><td>1,7&times;10<sup>-308</sup>..1,7&times;10<sup>308</sup></td><td>52+1</td><td>64</td></tr>
 
<tr><td>Extended precision</td><td>Нет, иногда long double</td><td>3,4&times;10<sup>-4932</sup>..3,4&times;10<sup>4932</sup></td><td>64+1</td><td>80</td></tr>
 
</table>
 
</center>
Обычно этот формат реализуется программно, случаи аппаратной реализации крайне редки. Также не гарантируется поддержка этого типа в языках программирования, хотя кое-где она и реализована (например, компилятор gcc для архитектуры x86 позволяет использовать тип __float128, являющийся программной реализацией числа с четверной точностью).
В совокупности эти факторы делают Quadruple весьма экзотичным и редко встречающимся форматом чисел с плавающей запятой.
 
 
== Особые значения чисел с плавающей точкой ==
=== Ноль (со знаком) ===
Как уже было оговорено выше, в нормализованной форме числа с плавающей точкой невозможно представить ноль. Поэтому для его представления зарезервированы специальные значения мантиссы и порядка. Число считается нулевым, если все биты порядка равны нулю и все биты мантиссы равны нулю. При этом в зависимости от значения одного бита знака ноль может быть быть как положительным, так и отрицательным.
 
{|class="wikitable" style="border-collapse: collapse; border: none"
|-
!colspan=5 style="background-color: powderblue; border: thin solid black; border-bottom: none"|Знак
|-
!style="background-color: powderblue; border: thin solid black; border-top: none"|
!colspan=5 style="background-color: lightgreen; border: thin solid black"|Порядок
!colspan=11 style="background-color: lightcoral; border: thin solid black"|Мантисса
!style="border: none"|
|-style="text-align: right"
!style="background-color: powderblue; border: thin solid black"|0/1
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="background-color: lightgreen; border: thin solid black"|0
!style="border: none"|1,
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: transparent; border: none"|&nbsp;=&nbsp;<tex>\pm0</tex>
|-
|style="border: none"|
|colspan=2 style="border: none; border-left: 1px solid gray; text-align: left"|14
|colspan=3 style="border: none; border-right: 1px solid gray; text-align: right"|10
|style="border: none"|
|colspan=5 style="border: none; border-left: 1px solid gray; text-align: left"|9
|colspan=5 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
 
'''Зачем нужен ноль со знаком?'''
<br/>
Знак у нуля был оставлен умышленно, хотя при сравнении согласно стандарту <tex>-0 = +0</tex>. Сделано это для того, чтобы получать всегда как можно более корректный результат, даже если считаемое значение выйдет за нижнюю или верхнюю границу точности (обернется в <tex>0</tex> или <tex>\infty</tex>). Кроме того, такой подход в некоторой мере отражает особенности, возникающие в математическом анализе, где, скажем, функция может стремиться к нулю "сверху" или "снизу". Также ноль со знаком находит применение в статистической механике и некоторых других дисциплинах.
 
 
'''Арифметика нуля со знаком'''
<br/>
Арифметика отрицательного нуля аналогична таковой для любого отрицательного числа и понятна интуитивно. Вот несколько примеров:
 
* <tex>\frac{-0}{ \left| x \right| } = -0\,\!</tex> (если <tex>x\ne0</tex>)
 
* <tex>(-0) \cdot (-0) = +0\,\!</tex>
 
* <tex>\left| x \right| \cdot (-0) = -0\,\!</tex>
 
* <tex>x + (\pm 0) = x\,\!</tex>
 
* <tex>(-0) + (-0) = -0\,\!</tex>
 
* <tex>(+0) + (+0) = +0\,\!</tex>
 
* <tex>\frac{-0}{-\infty} = +0\,\!</tex>
 
* <tex>\frac{\left|x\right|}{-0} = -\infty\,\!</tex> (если <tex>x\ne0</tex>)
 
 
== Диапазон значений чисел с плавающей запятой ==
Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя (когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number, "не число", получается как результат операций типа деления нуля на ноль) и <tex>\pm\infty</tex>.
 
<!-- TODO: Выкинуть нафиг эту бессмысленную таблицу, переписать весь раздел, привести распределение значений и формулу для подсчета их количества -->
 
<center>
 
<table border=1 CellSpacing="0" CellPadding="2">
 
<tr><th>Название (IEEE 754)</th><th>Тип (C)</th><th>Диапазон</th><th>Биты мантиссы</th><th>Биты</th></tr>
 
<tr><td>Half precision</td><td>Нет</td><td>6,10&times;10<sup>-5</sup>..65504</td><td>10+1</td><td>16</td></tr>
 
<tr><td>Single precision</td><td>float</td><td>3,4&times;10<sup>-38</sup>..3,4&times;10<sup>38</sup></td><td>23+1</td><td>32</td></tr>
 
<tr><td>Double precision</td><td>double</td><td>1,7&times;10<sup>-308</sup>..1,7&times;10<sup>308</sup></td><td>52+1</td><td>64</td></tr>
 
<tr><td>Extended precision</td><td>Нет, иногда long double</td><td>3,4&times;10<sup>-4932</sup>..3,4&times;10<sup>4932</sup></td><td>64+1</td><td>80</td></tr>
 
</table>
 
</center>
</OL>
 
== Ссылки ==
* [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/Число_с_плавающей_запятой]
* [http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE#.D0.9F.D1.80.D0.B5.D0.B4.D1.81.D1.82.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.87.D0.B8.D1.81.D0.B5.D0.BB_.D0.B2_.D0.BF.D0.B0.D0.BC.D1.8F.D1.82.D0.B8_.D0.BA.D0.BE.D0.BC.D0.BF.D1.8C.D1.8E.D1.82.D0.B5.D1.80.D0.B0 http://ru.wikipedia.org/wiki/Число]
* [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://ru.wikipedia.org/wiki/Отрицательный и положительный ноль]
*[http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BF%D0%BE%D0%BB%D0%BE%D0%B2%D0%B8%D0%BD%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_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%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/Число_одинарной_точности]
101
правка

Навигация