Редактирование: Представление вещественных чисел

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

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
Вещественные числа обычно представляются в виде чисел с плавающей запятой. Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений, его можно считать аналогом экспоненциальной записи чисел, но только в памяти компьютера.
+
Вещественные числа обычно представляются в виде чисел с плавающей запятой. Числа с плавающей запятой — один из возможных способов предсталения действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений, его можно считать аналогом экспоненциальной записи чисел, но только в памяти компьютера.
  
Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые '''знак''' (англ.'' sign''), '''порядок''' (англ. ''exponent'') и '''мантиссу''' (англ. ''mantis''). В наиболее распространённом формате (стандарт IEEE 754) число с плавающей запятой представляется в виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и ещё один бит используется для указания знака числа (<tex>0</tex> {{---}} если число положительное, <tex>1</tex> {{---}} если число отрицательное). При этом порядок записывается как целое число в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|коде со сдвигом]], а мантисса {{---}} в [[#Нормальная и нормализованная форма|нормализованном виде]], своей дробной частью в двоичной системе счисления. Вот пример такого числа из <tex>16</tex> двоичных разрядов:
+
Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые '''знак''', '''порядок''' и '''мантиссу'''. В наиболее распространённом формате (стандарт IEEE 754) число с плавающей запятой представляется в виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и ещё один бит используется для указания знака числа (0 - если число положительное, 1 - если число отрицательное). При этом порядок записывается как целое число в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|коде со сдвигом]], а мантисса - в [[#Нормальная и нормализованная форма|нормализованном виде]], своей дробной частью в двоичной системе счисления. Вот пример такого числа из 16 двоичных разрядов:
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
|-
 
|-
Строка 35: Строка 35:
 
|}
 
|}
  
Знак {{---}} один бит, указывающий знак всего числа с плавающей точкой. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:
+
Знак - один бит, указывающий знак всего числа с плавающей точкой. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:
  
<tex>(-1)^S \times M \times B^E</tex>, где <tex>S</tex> {{---}} знак, <tex>B</tex> {{---}} основание, <tex>E</tex> {{---}} порядок, а <tex>M</tex> {{---}} мантисса.
+
<tex>(-1)^s \times M \times B^E</tex>, где s — знак, B-основание, E порядок, а M мантисса.
Десятичное число, записываемое как <tex> ReE</tex>, где <tex>R</tex> {{---}} число в полуинтервале <tex>[1; 10)</tex>, <tex>E</tex> {{---}} степень, в которой стоит множитель <tex>10</tex>; в нормализированной форме модуль <tex>R</tex> будет являться мантиссой, а <tex>E</tex> {{---}} порядком, а <tex>S</tex> будет равно <tex>1</tex> тогда и только тогда, когда <tex>R</tex> принимает отрицательное значение.
 
Например, в числе <tex>-2435e9</tex>
 
* <tex>S</tex> <tex>=</tex> <tex>1</tex>
 
* <tex>B</tex> <tex>=</tex> <tex>10</tex>
 
* <tex>M</tex> <tex>=</tex> <tex>2435</tex>
 
* <tex>E</tex> <tex>=</tex> <tex>9</tex>
 
  
 
Порядок также иногда называют '''экспонентой''' или просто '''показателем степени'''.
 
Порядок также иногда называют '''экспонентой''' или просто '''показателем степени'''.
Строка 50: Строка 44:
 
При этом лишь некоторые из вещественных чисел могут быть представлены в памяти компьютера точным значением, в то время как остальные числа представляются приближёнными значениями.
 
При этом лишь некоторые из вещественных чисел могут быть представлены в памяти компьютера точным значением, в то время как остальные числа представляются приближёнными значениями.
  
Более простым вариантом представления вещественных чисел является вариант с фиксированной точкой, когда целая и вещественная части хранятся отдельно. Например, на целую часть отводится всегда <tex>X</tex> бит и на дробную отводится всегда <tex>Y</tex> бит. Такой способ в архитектурах процессоров не присутствует. Отдаётся предпочтение числам с плавающей запятой, как компромиссу между диапазоном допустимых значений и точностью.
 
  
 
== Нормальная и нормализованная форма ==
 
== Нормальная и нормализованная форма ==
  
'''Нормальной формой''' (англ. ''normal form'') числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале <tex>[0; 1)</tex>. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, <tex>0{,}0001</tex> можно записать в 4 формах — <tex>0{,}0001 \times 10</tex><sup><tex>0</tex></sup>, <tex>0{,}001 \times 10</tex><sup><tex>−1</tex></sup>, <tex>0{,}01 \times 10</tex><sup><tex>−2</tex></sup>, <tex>0{,}1 \times 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>).
+
'''Нормальной формой''' числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [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>).
Так как старший двоичный разряд (целая часть) мантиссы вещественного числа в нормализованном виде всегда равен «<tex>1</tex>», то его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем <tex>2</tex> (в троичной, четверичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).
+
Так как старший двоичный разряд (целая часть) мантиссы вещественного числа в нормализованном виде всегда равен «1», то его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем 2 (в троичной, четверичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).
 +
{|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="text-align: right"
 +
!style="background-color: powderblue; 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="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
 +
<!-- 8 бит -->
 +
!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="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
 +
|}
 +
 
  
 
== Типы чисел с плавающей точкой (по IEEE 754) ==
 
== Типы чисел с плавающей точкой (по IEEE 754) ==
 
=== Число половинной точности (''Binary16'', ''Half precision'') ===
 
=== Число половинной точности (''Binary16'', ''Half precision'') ===
  
'''Число́ полови́нной то́чности'''  — компьютерный формат представления чисел, занимающий в памяти половину машинного слова (в случае 32-битного компьютера — <tex>16</tex> бит или <tex>2</tex> байта). В силу невысокой точности этот формат представления чисел с плавающей запятой обычно используется в видеокартах, где небольшой размер и высокая скорость работы важнее точности вычислений.
+
'''Число́ полови́нной то́чности'''  — компьютерный формат представления чисел, занимающий в памяти половину машинного слова (в случае 32-битного компьютера — 16 бит или 2 байта). В силу невысокой точности этот формат представления чисел с плавающей запятой обычно используется в видеокартах, где небольшой размер и высокая скорость работы важнее точности вычислений.
  
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
Строка 95: Строка 123:
 
|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|}
 
|}
Порядок записан [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|со сдвигом]] '''<tex>-15</tex>'''. То есть чтобы получить актуально значение порядка нужно вычесть из него сдвиг. Сдвиг можно получить по формуле <tex>2^{b-1}-1</tex>, где <tex>b</tex> {{---}} число бит, отведенное на хранение порядка (в случае числа половинной точности <tex>b=5</tex>).
+
Порядок записан [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|со сдвигом]] '''-15'''. То есть чтобы получить актуально значение порядка нужно вычесть из него сдвиг. Сдвиг можно получить по формуле <tex>2^{b-1}-1</tex>, где <tex>b</tex> - число бит, отведенное на хранение порядка (в случае числа половинной точности <tex>b=5</tex>).
  
 
'''Ограничения точности'''
 
'''Ограничения точности'''
* Целые от нуля до <tex>2048</tex> передаются как есть.
+
* Целые от нуля до 2048 передаются как есть.
* Целые от <tex>2049</tex> до <tex>4096</tex> округляются к ближайшему чётному целому.
+
* Целые от 2049 до 4096 округляются к ближайшему чётному целому.
* Целые от <tex>4097</tex> до <tex>8192</tex> округляются до ближайшего целого, делящегося нацело на четыре.
+
* Целые от 4097 до 8192 округляются до ближайшего целого, делящегося нацело на 4.
* Целые от <tex>8193</tex> до <tex>16384</tex> округляются до ближайшего целого, делящегося на восемь.
+
* Целые от 8193 до 16384 округляются до ближайшего целого, делящегося на 8.
* Целые от <tex>16385</tex> до <tex>32768</tex> округляются до ближайшего целого, делящегося на шестнадцать.
+
* Целые от 16385 до 32768 округляются до ближайшего целого, делящегося на 16.
* Целые от <tex>32769</tex> до <tex>65535</tex> округляются до ближайшего целого, делящегося на тридцать два.
+
* Целые от 32769 до 65535 округляются до ближайшего целого, делящегося на 32.
  
  
 
=== Число одинарной точности (''Binary32'', ''Single precision'', ''float'') ===
 
=== Число одинарной точности (''Binary32'', ''Single precision'', ''float'') ===
  
'''Число́ одина́рной то́чности''' — компьютерный формат представления чисел, занимающий в памяти одно машинное слово (в случае 32-битного компьютера — <tex>32</tex> бита или <tex>4</tex> байта). Используется для работы с вещественными числами везде, где не нужна очень высокая точность.
+
'''Число́ одина́рной то́чности''' — компьютерный формат представления чисел, занимающий в памяти одно машинное слово (в случае 32-битного компьютера — 32 бита или 4 байта). Используется для работы с вещественными числами везде, где не нужна очень высокая точность.
  
 
{|class="wikitable" style="background-color: transparent; border-collapse: collapse; border: none"
 
{|class="wikitable" style="background-color: transparent; border-collapse: collapse; border: none"
Строка 160: Строка 188:
 
|colspan=3  style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|colspan=3  style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|}
 
|}
Порядок записан со сдвигом '''<tex>-127</tex>'''.  
+
Порядок записан со сдвигом '''-127'''.  
  
  
Строка 166: Строка 194:
  
 
'''Число́ двойно́й то́чности''' —  
 
'''Число́ двойно́й то́чности''' —  
компьютерный формат представления чисел, занимающий в памяти два машинных слова (в случае 32-битного компьютера — <tex>64</tex> бита или <tex>8</tex> байт). Часто используется благодаря своей неплохой точности, даже несмотря на двойной расход памяти и сетевого трафика относительно чисел одинарной точности.
+
компьютерный формат представления чисел, занимающий в памяти два машинных слова (в случае 32-битного компьютера — 64 бита или 8 байт). Часто используется благодаря своей неплохой точности, даже не смотря на двойной расход памяти и сетевого трафика относительно чисел одинарной точности.
  
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
Строка 249: Строка 277:
 
|colspan=4  style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|colspan=4  style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|}
 
|}
Порядок записан со сдвигом '''<tex>-1023</tex>'''.
+
Порядок записан со сдвигом '''-1023'''.
 +
 
  
 
=== Число четверной точности (''Binary128'', ''Quadruple precision'') ===
 
=== Число четверной точности (''Binary128'', ''Quadruple precision'') ===
  
 
'''Число́ четверно́й то́чности''' —  
 
'''Число́ четверно́й то́чности''' —  
компьютерный формат представления чисел, занимающий в памяти четыре машинных слова (в случае 32-битного компьютера — <tex>128</tex> бит или <tex>16</tex> байт). Используется в случае необходимости крайне высокой точности.
+
компьютерный формат представления чисел, занимающий в памяти четыре машинных слова (в случае 32-битного компьютера — 128 бит или 16 байт). Используется в случае необходимости крайне высокой точности.
  
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
Строка 408: Строка 437:
 
|colspan=66  style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|colspan=66  style="border: none; border-right: 1px solid gray; text-align: right"|0
 
|}
 
|}
Порядок записан со сдвигом '''<tex>-16383</tex>'''.
+
Порядок записан со сдвигом '''-16383'''.
  
 
Обычно этот формат реализуется программно, случаи аппаратной реализации крайне редки. Также не гарантируется поддержка этого типа в языках программирования, хотя кое-где она и реализована (например, компилятор gcc для архитектуры x86 позволяет использовать тип __float128, являющийся программной реализацией числа с четверной точностью).
 
Обычно этот формат реализуется программно, случаи аппаратной реализации крайне редки. Также не гарантируется поддержка этого типа в языках программирования, хотя кое-где она и реализована (например, компилятор gcc для архитектуры x86 позволяет использовать тип __float128, являющийся программной реализацией числа с четверной точностью).
Строка 420: Строка 449:
  
 
<!-- TODO: Выкинуть нафиг эту бессмысленную таблицу, переписать весь раздел, привести распределение значений и формулу для подсчета их количества -->
 
<!-- TODO: Выкинуть нафиг эту бессмысленную таблицу, переписать весь раздел, привести распределение значений и формулу для подсчета их количества -->
{| class="wikitable"
+
 
!Название в IEEE 754|| Название типа переменной в Си || Диапазон значений || Бит в мантиссе || Бит на переменную
+
<center>
|-
+
 
|Half precision||-||6,10&times;10<sup>-5</sup>..65504||11||16
+
<table border=1 CellSpacing="0" CellPadding="2">
|-
+
 
|Single presicion||float||-3,4&times;10<sup>38</sup>..3,4&times;10<sup>38</sup>||23||32
+
<tr><th>Название (IEEE 754)</th><th>Тип в языке программирования C</th><th>Диапазон</th><th>Биты мантиссы</th><th>Биты</th></tr>
|-
+
 
|Double precision||double||-1,7&times;10<sup>308</sup>..1,7&times;10<sup>308</sup>||53||64
+
<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>
|-
+
 
|Extended precision||На некоторых архитектурах (например в сопроцессоре Intel) long double||-3,4&times;10<sup>4932</sup>..3,4&times;10<sup>4932||65||80
+
<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>
  
 
== Особые значения чисел с плавающей точкой ==
 
== Особые значения чисел с плавающей точкой ==
 
=== Ноль (со знаком) ===
 
=== Ноль (со знаком) ===
Как уже было оговорено выше, в нормализованной форме числа с плавающей точкой невозможно представить ноль. Поэтому для его представления зарезервированы специальные значения мантиссы и порядка {{---}} число считается нулём, если все его биты, кроме знакового, равны нулю. При этом в зависимости от значения бита знака ноль может быть как положительным, так и отрицательным.   
+
Как уже было оговорено выше, в нормализованной форме числа с плавающей точкой невозможно представить ноль. Поэтому для его представления зарезервированы специальные значения мантиссы и порядка - число считается нулём, если все его биты, кроме знакового, равны нулю. При этом в зависимости от значения бита знака ноль может быть быть как положительным, так и отрицательным.   
  
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
Строка 491: Строка 527:
  
 
* <tex>\frac{\left|x\right|}{-0} = -\infty\,\!</tex>  (если <tex>x\ne0</tex>)
 
* <tex>\frac{\left|x\right|}{-0} = -\infty\,\!</tex>  (если <tex>x\ne0</tex>)
 +
  
 
=== Неопределенность (''NaN'') ===
 
=== Неопределенность (''NaN'') ===
'''NaN''' {{---}} это аббревиатура от фразы "''not a number''". NaN является результатом арифметических операций, если во время их выполнения произошла ошибка (примеры см. ниже). В IEEE 754 NaN представлен как число, в котором все двоичные разряды порядка {{---}} единицы, а мантисса не нулевая.
+
'''NaN''' - это аббревиатура от фразы "''not a number''". NaN является результатом арифметических операций, если во время их выполнения произошла ошибка (примеры см. ниже). В IEEE 754 NaN представлен как число, в котором все двоичные разряды порядка - единицы, а мантисса не нулевая.
  
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
Строка 540: Строка 577:
 
* <tex>0\times\infty= NaN</tex>
 
* <tex>0\times\infty= NaN</tex>
  
* <tex>\frac{\pm0}{\pm0} = NaN</tex>
+
* <tex>\frac{\pm0}{\pm0}=\frac{\pm\infty}{\pm\infty} = NaN</tex>
 
 
* <tex>\frac{\pm\infty}{\pm\infty} = NaN</tex>
 
  
 
* <tex>\sqrt{x} = NaN</tex>, где <tex>x<0</tex>
 
* <tex>\sqrt{x} = NaN</tex>, где <tex>x<0</tex>
Строка 553: Строка 588:
  
 
=== Бесконечности ===
 
=== Бесконечности ===
В число с плавающей запятой можно записать значение <tex>+\infty</tex> или <tex>-\infty</tex>. Как и нули со знаком, бесконечности позволяют получить хотя бы близкий к правильному результат вычисления в случае переполнения. Согласно стандарту IEEE 754 число с плавающей запятой считается равным бесконечности, если все двоичные разряды его порядка {{---}} единицы, а мантисса равна нулю. Знак бесконечности определяется знаковым битом числа.
+
В число с плавающей запятой можно записать значение <tex>+\infty</tex> или <tex>-\infty</tex>. Как и нули со знаком, бесконечности позволяют получить хотя бы близкий к правильному результат вычисления в случае переполнения. Согласно стандарту IEEE 754 число с плавающей запятой считается равным бесконечности, если все двоичные разряды его порядка - единицы, а мантисса равна нулю. Знак бесконечности определяется знаковым битом числа.
  
 
{|class="wikitable" style="border-collapse: collapse; border: none"
 
{|class="wikitable" style="border-collapse: collapse; border: none"
Строка 605: Строка 640:
  
 
=== Денормализованные числа ===
 
=== Денормализованные числа ===
'''Денормализованные числа''' (англ. ''denormalized/subnormal numbers'') - это способ увеличить количество представимых числом с плавающей запятой значений около нуля, дабы повысить точность вычислений. Каждое значение денормализованного числа меньше самого маленького '''нормализованного''' ("обычного") значения числа с плавающей запятой.
+
'''Денормализованные числа''' (''denormalized/subnormal numbers'') - это способ увеличить количество представимых числом с плавающей запятой значений около нуля, дабы повысить точность вычислений. Каждое значение денормализованного числа меньше самого маленького '''нормализованного''' ("обычного") значения числа с плавающей запятой.
Согласно стандарту, если порядок равен своему минимальному значению (все его биты {{---}} нули, а истинное значение порядка равно его сдвигу) и все биты мантиссы равны нулю, то это <tex>\pm0</tex>. Если же мантисса не равна нулю, то это число с порядком, на единицу большим минимального (все биты порядка, кроме младшего {{---}} нули) и данной мантиссой, '''целая часть которой считается равной нулю, а не единице'''.
+
Согласно стандарту, если порядок равен своему минимальному значению (все его биты - нули, а истинное значение порядка равно его сдвигу) и все биты мантиссы равны нулю, то это <tex>\pm0</tex>. Если же мантисса не равна нулю, то это число с порядком, на единицу большим минимального (все биты порядка, кроме младшего - нули) и данной мантиссой, '''целая часть которой считается равной нулю, а не единице'''.
  
 
То есть число с плавающей запятой, при учете вышесказанного, можно задать следующим образом:
 
То есть число с плавающей запятой, при учете вышесказанного, можно задать следующим образом:
 
<br/>
 
<br/>
* <tex>(-1)^s\times1,M\times2^E</tex>, если <tex>E_{min} \le E \le E_{max}</tex> (''нормализованное число'')
+
* <tex>(-1)^s\times1.M\times2^E</tex>, если <tex>E_{min} \le E \le E_{max}</tex> (нормализованное число)
  
* <tex>(-1)^s\times0,M\times2^{E_{min}}</tex>, если <tex>E=E_{min}-1</tex> (''денормализованное число'')
+
* <tex>(-1)^s\times0.M\times2^{E_{min}}</tex>, если <tex>E=E_{min}-1</tex> (денормализованное число)
  
Где <tex>s</tex> {{---}} бит знака, <tex>M</tex> {{---}} последовательность битов мантиссы, <tex>E</tex> {{---}} значение порядка (с учетом сдвига), <tex>E_{min}</tex> {{---}} минимальное значение порядка, используемое для записи чисел (1 {{---}} ''сдвиг'') , <tex>E_{min}-1</tex> {{---}} минимальное значение порядка, которое он в принципе может принять (все биты нули, 0 {{---}} ''сдвиг'').
+
Где <tex>s</tex> - бит знака, <tex>M</tex> - последовательность битов мантиссы, <tex>E</tex> - значение порядка (с учетом сдвига), <tex>E_{min}</tex> - минимальное значение порядка, используемое для записи чисел (1-''сдвиг'') , <tex>E_{min}-1</tex> - минимальное значение порядка, которое он в принципе может принять (все биты нули, 0-''сдвиг'').
  
 
Хоть денормализованные числа и позволяют бороться с погрешностями и обрабатывать очень маленькие значения, за эти возможности приходится дорого платить. Ввиду сложности денормализованные числа крайне редко реализуют на аппаратном уровне - вместо этого используются программные реализации, работающие значительно медленнее. <br/>
 
Хоть денормализованные числа и позволяют бороться с погрешностями и обрабатывать очень маленькие значения, за эти возможности приходится дорого платить. Ввиду сложности денормализованные числа крайне редко реализуют на аппаратном уровне - вместо этого используются программные реализации, работающие значительно медленнее. <br/>
  
В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел. Ниже приведена часть таблицы из статьи Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values"<ref>[http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf Статья Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values" ''(англ.)'']</ref>
+
В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел. Ниже приведена таблица из [http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf статьи Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values" ''(англ.)'']
  
 
{| class="wikitable"
 
{| class="wikitable"
 
  !Производитель||Процессор||Замедление (разы)
 
  !Производитель||Процессор||Замедление (разы)
 
  |-
 
  |-
  |IBM||PowerPC 970||2,4
+
|AMD||K6||1.4
 +
|-
 +
|IBM||PowerPC G4||1.4
 +
|-
 +
|IBM||BlueGene/L||1.9
 +
|-
 +
|IBM||Power||2.1
 +
|-
 +
  |IBM||PowerPC 970||2.4
 +
|-
 +
|AMD||AthlonXP||5.5
 +
|-
 +
|AMD||Athlon||6.0
 
  |-
 
  |-
  |AMD||Athlon||6,0
+
  |AMD||AthlonXP||7.1
 
  |-
 
  |-
  |Intel||Pentium 3||15,8
+
  |Intel||Pentium 3 Xeon||14.5
 
  |-
 
  |-
  |AMD||Athlon 64||21,4
+
  |Intel||Pentium 3||15.8
 
  |-
 
  |-
  |AMD||Opteron64||23,8
+
  |Alpha||EV67||20.5
 
  |-
 
  |-
  |Intel||Core Duo||44,2
+
  |AMD||Athlon 64||21.4
 
  |-
 
  |-
  |Intel||P4 Xeon||97,9
+
  |AMD||Athlon 64 X2||23.3
 
  |-
 
  |-
  |Intel||Pentium 4||131,0
+
  |AMD||Opteron64||23.8
 
  |-
 
  |-
  |Intel||Itanium 2||183,2
+
  |Alpha||PCA56||31.9
 
  |-
 
  |-
  |Sun||UltraSPARC IV||520,0
+
|Intel||Core Duo||44.2
 +
|-
 +
|Intel||Pentium 4||92.2
 +
|-
 +
|Alpha||EV6.8||95.1
 +
|-
 +
|Intel||P4 Xeon||97.9
 +
|-
 +
|Intel||Pentium 4||131.0
 +
|-
 +
|Intel||Itanium 2||183.2
 +
|-
 +
  |Sun||UltraSPARC IV||520.0
 
  |}
 
  |}
  
Строка 658: Строка 717:
 
Пример:
 
Пример:
  
   e=<tex>3</tex>;  m=<tex>4.734612</tex>       (порядок и мантисса первого числа)
+
   e=3;  m=4.734612        (порядок и мантисса первого числа)
  × e=<tex>5</tex>;  m=<tex>5.417242</tex>       (порядок и мантисса второго числа)
+
  × e=5;  m=5.417242        (порядок и мантисса второго числа)
 
  -----------------------
 
  -----------------------
   e=<tex>8</tex>;  m=<tex>25.648538980104</tex> (произведение как оно есть)
+
   e=8;  m=25.648538980104 (произведение как оно есть)
   e=<tex>8</tex>;  m=<tex>25.64854</tex>       (мантисса после округления)
+
   e=8;  m=25.64854        (мантисса после округления)
   e=<tex>9</tex>;  m=<tex>2.564854</tex>       (нормализованная форма)
+
   e=9;  m=2.564854        (нормализованная форма)
 
-->
 
-->
  
Строка 672: Строка 731:
 
Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме. Пример:
 
Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме. Пример:
  
  Выполним сложение чисел с плавающей точкой и смещенным порядком в 32-х разрядном формате <tex>-269</tex> <tex>7</tex><tex>/</tex><tex>32</tex> и <tex>405,875</tex>.
+
  Выполним сложение чисел с плавающей точкой и смещенным порядком в 32-х разрядном формате -269 7/32 и 405,875.
  Переведем <tex>-269</tex> <tex>7</tex><tex>/</tex><tex>32</tex> в машинный вид. Для этого сначала переведем его в двоичную систему счисления.
+
  Переведем -269 7/32 в машинный вид. Для этого сначала переведем его в двоичную систему счисления.
  <tex>-269</tex> <tex>7</tex><tex>/</tex><tex>32</tex> <tex>=</tex> <tex>-269{,}21875</tex>
+
  -269 7/32 = -269,21875
  <tex>-269{,}21875</tex><sub><tex>10</tex></sub> <tex>=</tex> <tex>-100001101{,}00111</tex><sub><tex>2</tex></sub>
+
  -269,21875<sub>10</sub> = -100001101,00111<sub>2</sub>
  
 
  Нормализуем полученное двоичное число по правилам машинной арифметики.
 
  Нормализуем полученное двоичное число по правилам машинной арифметики.
  <tex>-100001101{,}00111</tex> <tex>=</tex> <tex>-1{,}0000110100111</tex><tex> \times</tex> <tex>10</tex><sup><tex>8</tex></sup>
+
  -100001101,00111 = -1,0000110100111 &times; 10<sup>1000</sup>
  
  Найдем смещенный порядок. Так как в условии говорится о 32-разрядном представлении, то смещение порядка равно <tex>127</tex><sub><tex>10</tex></sub>.
+
  Найдем смещенный порядок. Так как в условии говориться о 32-разрадном представлении, то смещение порядка равно 127<sub>10</sub>.
  <tex>E</tex> <tex>=</tex> <tex>8</tex><sub><tex>10</tex></sub> <tex>+</tex> <tex>127</tex><sub><tex>10</tex></sub> <tex>=</tex> <tex>1000</tex><sub><tex>2</tex></sub> <tex>+</tex> <tex>1111111</tex><sub><tex>2</tex></sub> <tex>=</tex> <tex>10000111</tex><sub><tex>2</tex></sub>
+
  E = 8<sub>10</sub> + 127<sub>10</sub> = 1000<sub>2</sub> + 1111111<sub>2</sub> = 10000111<sub>2</sub>
  
 
  Число отрицательное, следовательно, в бите знака будет стоять единица.
 
  Число отрицательное, следовательно, в бите знака будет стоять единица.
  
  Итак, первое число в машинном 32-разрядном представлении с плавающей точкой будет иметь вид:
+
  Итак, первое число в машинном 32-разрадном представлении с плавающей точкой будет иметь вид:
  <tex>1</tex><strong>10000111</strong><tex>00001101001110000000000</tex> (жирным шрифтом выделен порядок числа, длина мантиссы {{---}} 23 бита).
+
  1<strong>10000111</strong>00001101001110000000000 (жирным шрифтом выделен порядок числа, длина мантиссы - 23 бита).
  
 
  Переведем второе число в машинный вид, совершая те же действия.
 
  Переведем второе число в машинный вид, совершая те же действия.
  
  <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>
+
  405,87510 = 110010101,111<sub>2</sub> = 1,10010101111 &times; 10<sup>1000</sup>
В качестве мантиссы будут сохранены первые <tex>23</tex> бита после запятой т.е. <tex>10010101111000000000011</tex>.
 
 
  Очевидно, что порядок со смещением у второго числа будет таким же, как и у первого.
 
  Очевидно, что порядок со смещением у второго числа будет таким же, как и у первого.
  
Строка 698: Строка 756:
 
  Итак в машинном 32-разрядном представлении второе число будет иметь вид:
 
  Итак в машинном 32-разрядном представлении второе число будет иметь вид:
  
  <tex>0</tex><strong>10000111</strong><tex>10010101111000000000011</tex>
+
  0<strong>10000111</strong>10010101111000000000000
Далее в арифметических операциях будет использоваться число <tex>110010101</tex>,<tex>111</tex><sub><tex>2</tex></sub>=<tex>405{,}875</tex><sub><tex>10</tex></sub>, а не <tex>110010101{,}111000000000011</tex><sub><tex>2</tex></sub>=<tex>405{,}87510</tex><sub><tex>10</tex></sub> видимо для упрощения(хотя это не совсем корректно).
 
  
 
  Порядки у слагаемых равны, поэтому пропускаем шаг выравнивания порядков и проводим вычитание мантисс по правилам двоичной арифметики. В  
 
  Порядки у слагаемых равны, поэтому пропускаем шаг выравнивания порядков и проводим вычитание мантисс по правилам двоичной арифметики. В  
 
  компьютере этим занимается арифметический сопроцессор, встроенный в центральный процессор машины.
 
  компьютере этим занимается арифметический сопроцессор, встроенный в центральный процессор машины.
  
  <tex>1</tex>,<tex>1001010111100</tex><sub><tex>2</tex></sub> <tex>-</tex> <tex>1{,}0000110100111</tex><sub><tex>2</tex></sub> <tex>=</tex> <tex>0{,}1000100010101</tex><sub><tex>2</tex></sub>
+
  1,1001010111100<sub>2</sub> - 1,0000110100111<sub>2</sub> = 0,1000100010101<sub>2</sub>
  
  Приводим полученный результат к машинному виду. Для этого мы должны внести поправку в порядок {{---}} уменьшить его на единицу.
+
  Приводим полученный результат к машинному виду. Для этого мы должны внести поправку в порядок - уменьшить его на единицу.
  Знак результата {{---}} положительный, следовательно, бит знака содержит ноль.
+
  Знак результата -  положительный, следовательно, бит знака содержит ноль.
  
  <tex>0</tex><strong>10000110</strong><tex>00010001010100000000000</tex>
+
  0<strong>10000110</strong>00010001010100000000000
  
 
  Проверим правильность наших вычислений. Переведем результат в десятичное представление.
 
  Проверим правильность наших вычислений. Переведем результат в десятичное представление.
  
  Найдем реальный порядок результата, вычтя из него значение смещения <tex>127</tex><sub><tex>10</tex></sub>.
+
  Найдем реальный порядок результата, вычтя из него значение смещения 127<sub>10</sub>.
  
  <tex>E</tex> <tex>=</tex> <tex>10000110</tex><sub><tex>2</tex></sub> <tex>-</tex> <tex>1111111</tex><sub><tex>2</tex></sub> <tex>=</tex> <tex>134</tex><sub><tex>10</tex></sub> <tex>-</tex> <tex>127</tex><sub><tex>10</tex></sub> <tex>=</tex> <tex>7</tex><sub><tex>10</tex></sub> <tex>=</tex> <tex>111</tex><sub><tex>2</tex></sub>
+
  E = 10000110<sub>2</sub> - 1111111<sub>2</sub> = 134<sub>10</sub> - 127<sub>10</sub> = 7<sub>10</sub> = 111<sub>2</sub>
  
 
  Следовательно, число результата будет иметь вид:
 
  Следовательно, число результата будет иметь вид:
  <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>
+
  A = 1,000100010101 &times; 10<sup>111</sup> = 10001000,10101<sub>2</sub> = 136,65625<sub>10</sub>
  
  Результат наших вычислений верен, так как <tex>405{,}875</tex> - <tex>269{,}21875</tex> <tex>=</tex> <tex>136{,}65625</tex>.
+
  Результат наших вычислений верен, так как 405,875 - 269,21875 = 136,65625.
  
 
=== Алгоритм получения представления вещественного числа в памяти ЭВМ ===
 
=== Алгоритм получения представления вещественного числа в памяти ЭВМ ===
Строка 728: Строка 785:
 
памяти ЭВМ на примере величины типа Double.</P>
 
памяти ЭВМ на примере величины типа Double.</P>
  
<P>Как видно из таблицы, величина этого типа занимает в памяти <tex>8</tex> байт. На  
+
<P>Как видно из таблицы, величина это типа занимает в памяти 8 байт. На  
  
 
рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):</P>
 
рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):</P>
  
{|class="wikitable"
+
<center>
!Знак || Смещённый порядок || Мантисса
+
 
|-
+
<table border=1 CellSpacing="0" CellPadding="2">
|63 || 62..52 || 51..0
+
 
|}
+
<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>Можно заметить, что старший бит, отведенный под мантиссу, имеет номер  
 
<P>Можно заметить, что старший бит, отведенный под мантиссу, имеет номер  
  
<tex>51</tex>, т.е. мантисса занимает младшие <tex>52</tex> бита. Черта указывает здесь на  
+
51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на  
  
 
положение двоичной запятой. Перед запятой должен стоять бит целой части  
 
положение двоичной запятой. Перед запятой должен стоять бит целой части  
  
мантиссы, но поскольку она всегда равна <tex>1</tex>, здесь данный бит не требуется и  
+
мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и  
  
 
соответствующий разряд отсутствует в памяти (но он подразумевается).  
 
соответствующий разряд отсутствует в памяти (но он подразумевается).  
Строка 759: Строка 821:
 
смещение. Смещение выбирается так, чтобы минимальному значению порядка  
 
смещение. Смещение выбирается так, чтобы минимальному значению порядка  
  
соответствовал нуль. Например, для типа Double порядок занимает <tex>11</tex> бит и  
+
соответствовал нуль. Например, для типа Double порядок занимает 11 бит и  
  
имеет диапазон от <tex>2</tex><sup><tex>-1023</tex></sup> до <tex>2</tex><sup><tex>1023</tex></sup>, поэтому смещение равно <tex>1023</tex><sub>(<tex>10</tex>)</sub> <tex>=</tex>
+
имеет диапазон от 2<sup>-1023</sup> до 2<sup>1023</sup>, поэтому смещение равно 1023<sub>(10)</sub> =  
  
<tex>1111111111</tex><sub>(<tex>2</tex>)</sub>. Наконец, бит с номером <tex>63</tex> указывает на знак числа.</P>
+
1111111111<sub>(2)</sub>. Наконец, бит с номером 63 указывает на знак числа.</P>
  
 
<P>Таким образом, из вышесказанного вытекает следующий <strong>алгоритм</strong> для  
 
<P>Таким образом, из вышесказанного вытекает следующий <strong>алгоритм</strong> для  
Строка 773: Строка 835:
 
<LI>перевести модуль данного числа в двоичную систему счисления;</LI>
 
<LI>перевести модуль данного числа в двоичную систему счисления;</LI>
  
<LI>нормализовать двоичное число, т.е. записать в виде <I>M</I> <tex> \times </tex>2<I><sup>p</sup></I>, где <I>M</I>&nbsp;&#151;  
+
<LI>нормализовать двоичное число, т.е. записать в виде <I>M</I>&nbsp;&times;&nbsp;2<I><sup>p</sup></I>, где <I>M</I>&nbsp;&#151;  
  
мантисса (ее целая часть равна <tex>1</tex><sub>(<tex>2</tex>)</sub>) и <I>p</I>&nbsp;&#151; порядок, записанный в  
+
мантисса (ее целая часть равна 1<sub>(2)</sub>) и <I>p</I>&nbsp;&#151; порядок, записанный в  
  
 
десятичной системе счисления;</LI>
 
десятичной системе счисления;</LI>
Строка 789: Строка 851:
 
</OL>
 
</OL>
  
<P><B>Пример.</B> Запишем код числа <tex>-312</tex>,<tex>3125</tex>.</P>
+
<P><B>Пример.</B> Запишем код числа -312,3125.</P>
  
 
<OL>
 
<OL>
  
<LI>Двоичная запись модуля этого числа имеет вид <tex>100111000{,}0101</tex>.</LI>
+
<LI>Двоичная запись модуля этого числа имеет вид 100111000,0101.</LI>
  
<LI>Имеем <tex>100111000{,}0101</tex> <tex>=</tex>
+
<LI>Имеем 100111000,0101 =  
  
<tex>1{,}001110000101</tex><tex>\times</tex><tex>2</tex><sup><tex>8</tex></sup>.</LI>
+
1,001110000101&nbsp;&times;&nbsp;2<sup>8</sup>.</LI>
  
<LI>Получаем смещенный порядок <tex>8</tex> <tex>+</tex> <tex>1023</tex> <tex>=</tex> <tex>1031</tex>. Далее имеем  
+
<LI>Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем  
  
<tex>1031</tex><sub>(<tex>10</tex>)</sub> <tex>=</tex> <tex>10000000111</tex><sub>(<tex>2</tex>)</sub>.</LI>
+
1031<sub>(10)</sub> = 10000000111<sub>(2)</sub>.</LI>
  
 
<LI>Окончательно
 
<LI>Окончательно
  
{|class="wikitable"
+
<center>
| 1 || 10000000111 || 0011100001010000000000000000000000000000000000000000
+
 
|-
+
<table border=1 CellSpacing="0" CellPadding="2">
| 63 || 62..52 || 51..0
+
 
|}
+
<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>
 
</LI>
Строка 826: Строка 893:
 
<P><B>Пример.</B> Пусть дан код 3FEC600000000000<sub>(16)</sub> или
 
<P><B>Пример.</B> Пусть дан код 3FEC600000000000<sub>(16)</sub> или
  
<OL>
+
<center>
  
{|class="wikitable"
+
<table border=1 CellSpacing="0" CellPadding="2">
| 0 || 01111111110 || 1100011000000000000000000000000000000000000000000000
 
|-
 
| 63 || 62..52 || 51..0
 
|}
 
  
 +
<tr><td>0</td><td>01111111110</td><td>1100011000000000000000000000000000000000000000000000</td></tr>
  
 +
<tr><td>63</td><td>62..52</td><td>51..0</td></tr>
  
<LI>Прежде всего замечаем, что это код положительного числа, поскольку в
+
</table>
  
разряде с номером <tex>63</tex> записан нуль. Получим порядок этого числа:
+
</center>
  
<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>
+
<OL>
  
<LI>Число имеет вид <tex>1</tex>,<tex>1100011</tex><tex> \times </tex><tex>2</tex><sup><tex>-1</tex></sup> или
+
<LI>Прежде всего замечаем, что это код положительного числа, поскольку в
  
<tex>0</tex>,<tex>11100011</tex>.</LI>
+
разряде с номером 63 записан нуль. Получим порядок этого числа:
  
<LI>Переводом в десятичную систему счисления получаем <tex>0</tex>,<tex>88671875</tex>.</LI>
+
01111111110<sub>(2)</sub> = 1022<sub>(10)</sub>; 1022 - 1023 = -1.</LI>
  
 +
<LI>Число имеет вид 1,1100011&nbsp;&times;&nbsp;2<sup>-1</sup> или
  
</OL>
+
0,11100011.</LI>
  
== См. также ==
+
<LI>Переводом в десятичную систему счисления получаем 0,88671875.</LI>
* [[Представление символов, таблицы кодировок]]
 
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]
 
  
== Примечания ==
+
</OL>
<references/>
 
  
 
== Ссылки ==
 
== Ссылки ==
 
=== Использованные материалы ===
 
=== Использованные материалы ===
 
'''На русском'''
 
'''На русском'''
* [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%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%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://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://habrahabr.ru/blogs/cpp/112953/ Хабрахабр - статья пользователя Yruslan "Что нужно знать про арифметику с плавающей запятой"]
*[http://www.sgu.ru/prcnit/teach/3.php Статья Лапшевой Е.Е. "Машинная арифметика с вещественными числами"] <span style="color: red">Статья удалена</span>
+
*[http://www.sgu.ru/prcnit/teach/3.php Статья Лапшевой Е.Е. "Машинная арифметика с вещественными числами"]
  
 
'''На английском'''
 
'''На английском'''
*[http://en.wikipedia.org/wiki/NaN Wikipedia {{---}} NaN]
+
*[http://en.wikipedia.org/wiki/NaN Wikipedia - NaN]
*[http://en.wikipedia.org/wiki/Floating_point Wikipedia {{---}} Floating point]
+
*[http://en.wikipedia.org/wiki/Floating_point Wikipedia - Floating point]
*[http://en.wikipedia.org/wiki/IEEE_754-2008 Wikipedia {{---}} IEEE 754-2008]
+
*[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"]
  
 
=== Что стоит прочесть ===
 
=== Что стоит прочесть ===
 
* [http://grouper.ieee.org/groups/754 Материалы по стандарту IEEE 754 ''(англ.)'']
 
* [http://grouper.ieee.org/groups/754 Материалы по стандарту IEEE 754 ''(англ.)'']
 
* [http://softelectro.ru/ieee754.html Русский перевод стандарта IEEE 754]
 
* [http://softelectro.ru/ieee754.html Русский перевод стандарта IEEE 754]
 
 
 
  
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Представление информации]]
 
[[Категория: Представление информации]]

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: