Изменения

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

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

52 089 байт добавлено, 23 февраль
Нет описания правки
Вещественные числа обычно представляются в виде чисел с плавающей запятой. Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений, его можно считать аналогом экспоненциальной записи чисел, но только в памяти компьютера.
{{Определение|definition=Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые '''знак'''(англ.'Плавающая запятая'sign'' — форма представления дробных чисел), в которой '''порядок''' (англ. ''exponent'') и '''мантиссу''' (англ. ''mantis''). В наиболее распространённом формате (стандарт IEEE 754) число хранится с плавающей запятой представляется в форме мантиссы виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и показателя степениещё один бит используется для указания знака числа (<tex>0</tex> {{---}} если число положительное, <tex>1</tex> {{---}} если число отрицательное). При этом порядок записывается как целое число в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|коде со сдвигом]], а мантисса {{---}} в [[#Нормальная и нормализованная форма|нормализованном виде]], своей дробной частью в двоичной системе счисления. Вот пример такого числа из <tex>16</tex> двоичных разрядов:{|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=10 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="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|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следующем виде: <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>, <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> Порядок также иногда называют '''экспонентой''' или просто '''показателем степени'''. <!-- TODO:Абзац ниже нужно перенести в раздел с проблемами чисел -->
При этом лишь некоторые из вещественных чисел могут быть представлены в памяти компьютера точным значением, в то время как остальные числа представляются приближёнными значениями.
В наиболее распространённом формате число Более простым вариантом представления вещественных чисел является вариант с плавающей запятой представляется в виде последовательности битовфиксированной точкой, часть из которых кодирует собой мантиссу числакогда целая и вещественная части хранятся отдельно. Например, другая на целую часть — показатель степени, отводится всегда <tex>X</tex> бит и ещё один на дробную отводится всегда <tex>Y</tex> бит используется для указания знака числа. Такой способ в архитектурах процессоров не присутствует. Отдаётся предпочтение числам с плавающей запятой, 0 - если число положительное, 1 - если число отрицательноекак компромиссу между диапазоном допустимых значений и точностью.
=== Нормальная форма и нормализованная форма ===
'''Нормальной формой'' ' (англ. ''normal form'') числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале <tex>[0; 1)</tex>. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, <tex>0{,}0001 </tex> можно записать в 4 формах — <tex>0{,0001×10}0001 \times 10</tex><sup><tex>0</tex></sup>, <tex>0{,001×10}001 \times 10</tex><sup><tex>−1</tex></sup>, <tex>0{,01×10}01 \times 10</tex><sup><tex>−2</tex></sup>, <tex>0{,1×10}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>) записывается единственным образом. Недостаток заключается в том, что в таком виде Ноль же представить таким образом невозможно представить 0, поэтому представление чисел в информатике стандарт предусматривает специальный признак (бит) специальную последовательность битов для задания числа <tex>0</tex> (а заодно и некоторых других [[#Особые значения чисел с плавающей точкой|полезных чисел]], таких как <tex>-\infty</tex> и <tex>+\infty</tex>).Так как старший двоичный разряд (целая часть числа) мантиссы двоичного вещественного числа (кроме 0) в нормализованном виде всегда равен «1»«<tex>1</tex>», то при записи мантиссы числа в эвм старший разряд его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем <tex>2 </tex> (в троичной, четверичной и др.), этого замечательного свойства нет(ведь целая часть там может быть не только единицей).
=== Диапазон Типы чисел, представимых в формате с плавающей запятой точкой (по IEEE 754) ===Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся значения NaN == Число половинной точности (Not a Number''Binary16'', не число''Half precision'') и +/-INF (Infinity, бесконечность), получающихся в результате операций типа деления на ноль нуля, положительных и отрицательных чисел.===
'''Число́ полови́нной то́чности'''  — компьютерный формат представления чисел, занимающий в памяти половину компьютерного машинного слова (в случае 32-битного компьютера — 16 бит или 2 байта). Диапазон значений ± 2<suptex>−2416</suptex>(5.96E-8) — 65504. Приблизительная точность — 3 знака (10 двоичных знаков, logбит или <subtex>10</sub>(2<sup>11</suptex>байта)). В силу невысокой точности этот формат представления чисел с плавающей запятой обычно используется в видеокартах, где небольшой размер и высокая скорость работы важнее точности вычислений.
{|class="wikitable" style="border-collapse: collapse; border: none"
|-
!style="background-color: powderblue; border: thin solid black; border-top: none"|
!colspan=5 style="background-color: lightgreen; border: thin solid black"|Экспо-<br />нентаПорядок!colspan=10 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="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="border: none"| |colspan=4 3 style="border: none; border-left: 1px solid gray; text-align: left"|1514|colspan=4 2 style="border: none; border-right: 1px solid gray; text-align: right"|810|style="border: none"| |colspan=4 6 style="border: none; border-left: 1px solid gray; text-align: left"|79
|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>).
'''Ограничения точности'''* Целые от нуля до <tex>2048</tex> передаются как есть.* Целые от <tex>2049</tex> до <tex>4096</tex> округляются к ближайшему чётному целому.* Целые от <tex>4097</tex> до <tex>8192</tex> округляются до ближайшего целого, делящегося нацело на четыре.* Целые от <tex>8193</tex> до <tex>16384</tex> округляются до ближайшего целого, делящегося на восемь.* Целые от <tex>16385</tex> до <tex>32768</tex> округляются до ближайшего целого, делящегося на шестнадцать.* Целые от <tex>32769</tex> до <tex>65535</tex> округляются до ближайшего целого, делящегося на тридцать два.  === Число одинарной точности (''Binary32'', ''Single precision'', ''float'') === '''Число́ одина́рной то́чности''' — компьютерный формат представления чисел, занимающий в компьютерная памяти одну ячейку (одно машинное слово; (в случае 32-битного компьютера — <tex>32 </tex> бита или <tex>4 </tex> байта). Как правилоИспользуется для работы с вещественными числами везде, обозначает формат числа с плавающей точкой стандарта IEEE 754где не нужна очень высокая точность.
{|class="wikitable" style="background-color: transparent; border-collapse: collapse; border: none"
|-
!style="background-color: powderblue; border: thin solid black; border-top: none"|
!colspan=8 style="background-color: lightgreen; border: thin solid black"|ЭкспонентаПорядок (8 бит)!colspan=23 24 style="background-color: lightcoral; border: thin solid black"|Мантисса(23+1 бита)
|-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"|1
!style="background-color: lightgreen; border: thin solid black"|1
!style="background-color: lightgreen; border: thin solid black"|1
!style="background-color: lightgreen; border: thin solid black"|1
!style="background-color: lightgreen; border: thin solid black"|1
!style="background-color: lightgreen; border: thin solid black"|0
<!-- 24 бита -->
!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="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"|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
<!-- 16 бит -->
!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
<!-- 8 бит -->
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: lightcoral; border: thin solid black"|0
!style="background-color: transparent; border: none"|
|-
|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|31|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|24|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|2330|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|16|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|1523|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|8|colspan=4 20 style="border: none; border-left: 1px solid gray; text-align: left"|722|colspan=4 3 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
Порядок записан со сдвигом '''<tex>-127</tex>'''.
 
 
=== Число двойной точности (''Binary64'', ''Double precision'', ''double'') ===
'''Число́ двойно́й то́чности''' —
компьютерный формат представления чисел, занимающий в памяти две последовательных ячейки два машинных слова (компьютерных слова; в случае 32-битного компьютера — <tex>64 </tex> бита или <tex>8 </tex> байт). Как правилоЧасто используется благодаря своей неплохой точности, обозначает формат числа с плавающей запятой стандарта IEEE 754даже несмотря на двойной расход памяти и сетевого трафика относительно чисел одинарной точности.
{|class="wikitable" style="border-collapse: collapse; border: none"
|-
!style="background-color: powderblue; border: thin solid black; border-top: none"|
!colspan=11 style="background-color: lightgreen; border: thin solid black"|Порядок<br />(11 бит)!colspan=53 style="background-color: lightcoral; border: thin solid black"|Мантисса<br />Экспонента(52+1 бит)|-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="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="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: 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: 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: 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: 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: lightcoral; border: thin solid black"|0!style="background-color: lightcoral; border: thin solid black"|0|-|style="border: none"| |colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|62|colspan=7 style="border: none; border-right: 1px solid gray; text-align: right"|52 |style="border: none"| |colspan=48 style="border: none; border-left: 1px solid gray; text-align: left"|51|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|0|}Порядок записан со сдвигом '''<tex>-1023</tex>'''. === Число четверной точности (''Binary128'', ''Quadruple precision'') === '''Число́ четверно́й то́чности''' — компьютерный формат представления чисел, занимающий в памяти четыре машинных слова (в случае 32-битного компьютера — <tex>128</tex> бит или <tex>16</tex> байт). Используется в случае необходимости крайне высокой точности. {|class="wikitable" style="border-collapse: collapse; border: none"|-!colspan=7 style="background-color: powderblue; border: thin solid black; border-bottom: none"|Знак|-!style="background-color: powderblue; border: thin solid black; border-top: none"|!colspan=15 style="background-color: lightgreen; border: thin solid black"|Порядок<br />(15 бит)!colspan=47 style="background-color: lightcoral; border: thin solid black"|Мантисса<br />(112+1 бит)|-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="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="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: 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: 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: 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: 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=8 style="border: none; border-left: 1px solid gray; text-align: left"|126|colspan=7 style="border: none; border-right: 1px solid gray; text-align: right"|112|style="border: none"| |colspan=38 style="border: none; border-left: 1px solid gray; text-align: left"|111|}<br />{|class="wikitable" style="border-collapse: collapse; border: none"|-!colspan=66 style="background-color: lightcoral; border: thin solid black"|Мантисса<br />(112+1 бит)|-style="text-align: right"!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: 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: 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: 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: 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: 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: 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|-|colspan=66 style="border: none; border-right: 1px solid gray; text-align: right"|0|}Порядок записан со сдвигом '''<tex>-16383</tex>'''. Обычно этот формат реализуется программно, случаи аппаратной реализации крайне редки. Также не гарантируется поддержка этого типа в языках программирования, хотя кое-где она и реализована (например, компилятор gcc для архитектуры x86 позволяет использовать тип __float128, являющийся программной реализацией числа с четверной точностью).В совокупности эти факторы делают Quadruple весьма экзотичным и редко встречающимся форматом чисел с плавающей запятой.  === Диапазон значений чисел с плавающей запятой ===Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя (52 когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number, "не число", получается как результат операций типа деления нуля на ноль) и <tex>\pm\infty</tex>. Данная таблица только лишь примерно указывает границы допустимых значений, без учета возрастающей погрешности с ростом абсолютного значения и существования [[#Денормализованные числа|денормализованных чисел]].  <!-- TODO: Выкинуть нафиг эту бессмысленную таблицу, переписать весь раздел, привести распределение значений и формулу для подсчета их количества -->{| class="wikitable" !Название в 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 |} == Особые значения чисел с плавающей точкой ===== Ноль (со знаком) ===Как уже было оговорено выше, в нормализованной форме числа с плавающей точкой невозможно представить ноль. Поэтому для его представления зарезервированы специальные значения мантиссы и порядка {{---}} число считается нулём, если все его биты, кроме знакового, равны нулю. При этом в зависимости от значения битазнака ноль может быть как положительным, так и отрицательным.  {|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"|<sup>0</sup>/<sub>1</sub>!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>\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<br /tex>) === Неопределенность (''NaN'') ==='''NaN''' {{---}} это аббревиатура от фразы "''not a number''". NaN является результатом арифметических операций, если во время их выполнения произошла ошибка (примеры см. ниже). В IEEE 754 NaN представлен как число, в котором все двоичные разряды порядка {{---}} единицы, а мантисса не нулевая. {|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"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightgreen; border: thin solid blacknone"|&nbsp;1,!style="background-color: lightgreenlightcoral; border: thin solid black"|&nbsp;<!-- 56 бит --sup>0</sup>/<sub>1</sub>!style="background-color: lightgreenlightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightgreenlightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightgreenlightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightgreenlightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightcoral; border: thin solid black"|&nbsp;<!-- 48 бит --sup>0</sup>/<sub>1</sub>!style="background-color: lightcoral; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightcoraltransparent; border: thin solid blacknone"|&nbsp;!style="background-color: lightcoral; border: thin solid black"|&nbsp;<tex>NaN</tex>|-!|style="background-color: lightcoral; border: thin solid blacknone"|&nbsp;!|colspan=2 style="background-colorborder: lightcoralnone; border-left: thin 1px solid black"|&nbspgray;!style="backgroundtext-color: lightcoral; borderalign: thin solid blackleft"|&nbsp;14!|colspan=3 style="background-colorborder: lightcoralnone; border-right: thin 1px solid black"|&nbspgray;!style="backgroundtext-color: lightcoral; borderalign: thin solid blackright"|&nbsp;10<!-- 40 бит -->!|style="background-color: lightcoral; border: thin solid blacknone"|&nbsp;!|colspan=5 style="background-colorborder: lightcoralnone; border-left: thin 1px solid black"|&nbspgray;!style="backgroundtext-color: lightcoral; borderalign: thin solid blackleft"|&nbsp;9!|colspan=5 style="background-colorborder: lightcoralnone; border-right: thin 1px solid black"|&nbspgray;!style="backgroundtext-coloralign: lightcoral; border: thin solid blackright"|&nbsp;0|} Любая операция с NaN возвращает NaN. При желании в мантиссу можно записывать информацию, которую программа сможет интерпретировать. Стандартом это не оговорено и мантисса чаще всего игнорируется.  '''Как можно получить NaN?'''<br/> * <tex>\infty+(-\infty)= NaN</tex> * <tex>0\times\infty= NaN</tex> !style* <tex>\frac{\pm0}{\pm0} ="background-color: lightcoral; border: thin solid black"|&nbsp;NaN</tex> !style* <tex>\frac{\pm\infty}{\pm\infty} ="background-color: lightcoral; border: thin solid black"|&nbsp;NaN</tex> !style* <tex>\sqrt{x} ="background-color: lightcoral; border: thin solid black"NaN</tex>, где <tex>x<0</tex> Есть и другие способы получения NaN, подробности можно найти по ссылкам в [[#Ссылки|&nbsp;соответствующем разделе]]. По определению NaN ≠ NaN, поэтому, для проверки значения переменной нужно просто сравнить ее с собой.<!-- 32 бита TODO: написать про sNaN и qNaN -->!style === Бесконечности ==="backgroundВ число с плавающей запятой можно записать значение <tex>+\infty</tex> или <tex>-\infty</tex>. Как и нули со знаком, бесконечности позволяют получить хотя бы близкий к правильному результат вычисления в случае переполнения. Согласно стандарту IEEE 754 число с плавающей запятой считается равным бесконечности, если все двоичные разряды его порядка {{---color: lightcoral; border: thin solid black"}} единицы, а мантисса равна нулю. Знак бесконечности определяется знаковым битом числа. {|&nbsp;!styleclass="background-color: lightcoral; border: thin solid blackwikitable"|&nbsp;!style="backgroundborder-colorcollapse: lightcoralcollapse; border: thin solid blacknone"|&nbsp;-!colspan=5 style="background-color: lightcoralpowderblue; border: thin solid black"|&nbsp;!style="backgroundborder-colorbottom: lightcoral; border: thin solid blacknone"|&nbsp;Знак!style="background|-color: lightcoral; border: thin solid black"|&nbsp;!style="background-color: lightcoralpowderblue; border: thin solid black"|&nbsp;!style="backgroundborder-colortop: lightcoral; border: thin solid blacknone"|&nbsp;<!-- 24 бита -->!colspan=5 style="background-color: lightcorallightgreen; border: thin solid black"|&nbsp;Порядок!colspan=11 style="background-color: lightcoral; border: thin solid black"|&nbsp;Мантисса!style="background-color: lightcoral; border: thin solid blacknone"|&nbsp;!style="background|-color: lightcoral; border: thin solid black"|&nbsp;!style="backgroundtext-color: lightcoral; borderalign: thin solid blackright"|&nbsp;!style="background-color: lightcoralpowderblue; border: thin solid black"|&nbsp;<sup>0</sup>/<sub>1</sub>!style="background-color: lightcorallightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightcorallightgreen; border: thin solid black"|&nbsp;<!-- 16 бит -->1!style="background-color: lightcorallightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightcorallightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightcorallightgreen; border: thin solid black"|&nbsp;1!style="background-color: lightcoral; border: thin solid blacknone"|&nbsp;1,!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;<!-- 8 бит -->0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoral; border: thin solid black"|&nbsp;0!style="background-color: lightcoraltransparent; border: thin solid blacknone"|&nbsp;!style="background-color: lightcoral; border: thin solid black"|&nbsp;<tex>\pm\infty</tex>
|-
|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|63|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|56|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|55|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|48|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|47|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|40|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|39|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|32|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|31|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|24|colspan=4 2 style="border: none; border-left: 1px solid gray; text-align: left"|2314|colspan=4 3 style="border: none; border-right: 1px solid gray; text-align: right"|1610|colspan=4 style="border: none; border-left: 1px solid gray; text-align: left"|15|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|8|colspan=4 5 style="border: none; border-left: 1px solid gray; text-align: left"|79|colspan=4 5 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
Получить бесконечность можно при переполнении и при делении ненулевого числа на ноль. При этом <tex dpi = "180">\frac{x}{0}</tex><tex>=\begin{cases}+\infty,&\text{если $x>0$;}\\NaN,&\text{если $x=0$;}\\-\infty,&\text{если $x<0$.}\end{cases} </tex> ===CсылкиДенормализованные числа ==='''Денормализованные числа''' (англ. ''denormalized/subnormal numbers'') - это способ увеличить количество представимых числом с плавающей запятой значений около нуля, дабы повысить точность вычислений. Каждое значение денормализованного числа меньше самого маленького '''нормализованного''' ("обычного") значения числа с плавающей запятой.Согласно стандарту, если порядок равен своему минимальному значению (все его биты {{---}} нули, а истинное значение порядка равно его сдвигу) и все биты мантиссы равны нулю, то это <tex>\pm0</tex>. Если же мантисса не равна нулю, то это число с порядком, на единицу большим минимального (все биты порядка, кроме младшего {{---}} нули) и данной мантиссой, '''целая часть которой считается равной нулю, а не единице'''. То есть число с плавающей запятой, при учете вышесказанного, можно задать следующим образом:<br/>* <tex>(-1)^s\times1,M\times2^E</tex>, если <tex>E_{min} \le E \le E_{max}</tex> (''нормализованное число'') * [http:<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</rutex> {{---}} минимальное значение порядка, которое он в принципе может принять (все биты нули, 0 {{---}} ''сдвиг''). Хоть денормализованные числа и позволяют бороться с погрешностями и обрабатывать очень маленькие значения, за эти возможности приходится дорого платить.wikipediaВвиду сложности денормализованные числа крайне редко реализуют на аппаратном уровне - вместо этого используются программные реализации, работающие значительно медленнее.org<br/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 > В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел. Ниже приведена часть таблицы из статьи Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values"<ref>[http://rucharm.cs.wikipediauiuc.orgedu/wikipapers/Число_с_плавающей_запятойSubnormalOSIHPA06.pdf Статья Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values" ''(англ.)'']</ref> {| class="wikitable" !Производитель||Процессор||Замедление (разы) |- |IBM||PowerPC 970||2,4 |- |AMD||Athlon||6,0 |- |Intel||Pentium 3||15,8 |- |AMD||Athlon 64||21,4 |- |AMD||Opteron64||23,8 |- |Intel||Core Duo||44,2 |- |Intel||P4 Xeon||97,9* [http |- |Intel||Pentium 4||131,0 |- |Intel||Itanium 2||183,2 |- |Sun||UltraSPARC IV||520,0 |} В таблице приведены наихудшие результаты тестирования среди всех использованных компиляторов (gcc, icc, xlc) со всеми доступными флагами оптимизации. Исследователи утверждают, что различие среднего случая с худшим незначительно. Поскольку в стандартных форматах (одинарной и двойной точности) денормализованные числа получаются действительно ''очень'' маленькими и практически никак не влияют на результат некоторых вычислений (при этом заметно замедляя их скорость), то иногда они просто игнорируются. При этом используются два простых механизма, получивших называние ''Flush-to-zero'' (''FTZ'') и ''Denormals-are-zero'' (''DAZ''). Первый механизм заставляет операции возвращать ноль, как только становится ясно, что результат будет денормализованным. Второй механизм заставляет операции рассматривать поступающие на вход денормализованные числа как нули. <br/>Ярким примером подобного "отсечения" денормализованных чисел могут послужить видеокарты, в которых резкое падение скорости вычислений в сотню раз недопустимо. Так же, например, в областях, связанных с обработкой звука, нет нужды в очень маленьких числах, поскольку они представляют столь тихий звук, что его не способно воспринять человеческое ухо. В версии стандарта IEEE 754-2008 денормализованные числа (''denormal'' или ''denormalized numbers'') были переименованы в ''subnormal numbers'', то есть в числа, меньшие "нормальных". Поэтому их иногда еще называют "'''субнормальными'''".  == Действия с числами с плавающей запятой ===== Умножение и деление ===Самыми простыми для восприятия арифметическими операциями над числами с плавающей запятой являются умножение и деление. Для того, чтобы умножить два вещественных числа в нормализованной форме необходимо перемножить их мантиссы, сложить порядки, округлить и нормализовать полученное число.<!-- Пример e=<tex>3</tex>; m=<tex>4.734612</tex> (порядок и мантисса первого числа) × e=<tex>5</rutex>; m=<tex>5.wikipedia417242</tex> (порядок и мантисса второго числа) ----------------------- e=<tex>8</tex>; m=<tex>25.org648538980104</wikitex> (произведение как оно есть) e=<tex>8</%D0%A7%D0%B8%D1%81%D0%BB%D0%BE#tex>; m=<tex>25.D064854</tex> (мантисса после округления) e=<tex>9</tex>; m=<tex>2.9F564854</tex> (нормализованная форма)--> Соответственно, чтобы произвести деление нужно разделить мантиссу делимого на мантиссу делителя и вычесть из порядка делимого порядок делителя.D1Затем точно так же округлить мантиссу результата и привести его к нормализованной форме.80<!-- Всё это круто, но было бы еще круче написать, как оно на реальном железе умножается и делится.D0В двоичной системе, с учетом округления и всеми делами.B5Но это, пожалуй, будет уж слишком мощно для формата "вики-конспекта".D0лучше куда-нибудь сюда добавить внешнюю ссылку --> === Сложение и вычитание ===Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку.B4Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме.D1Пример:  Выполним сложение чисел с плавающей точкой и смещенным порядком в 32-х разрядном формате <tex>-269</tex> <tex>7</tex><tex>/</tex><tex>32</tex> и <tex>405,875</tex>.81 Переведем <tex>-269</tex> <tex>7</tex><tex>/</tex><tex>32</tex> в машинный вид.D1Для этого сначала переведем его в двоичную систему счисления.82 <tex>-269</tex> <tex>7</tex><tex>/</tex><tex>32</tex> <tex>=</tex> <tex>-269{,}21875</tex> <tex>-269{,}21875</tex><sub><tex>10</tex></sub> <tex>=</tex> <tex>-100001101{,}00111</tex><sub><tex>2</tex></sub>  Нормализуем полученное двоичное число по правилам машинной арифметики.D0 <tex>-100001101{,}00111</tex> <tex>=</tex> <tex>-1{,}0000110100111</tex><tex> \times</tex> <tex>10</tex><sup><tex>1000</tex></sup>  Найдем смещенный порядок.B0Так как в условии говорится о 32-разрядном представлении, то смещение порядка равно <tex>127</tex><sub><tex>10</tex></sub>.D0 <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>  Число отрицательное, следовательно, в бите знака будет стоять единица.B2  Итак, первое число в машинном 32-разрядном представлении с плавающей точкой будет иметь вид: <tex>1</tex><strong>10000111</strong><tex>00001101001110000000000</tex> (жирным шрифтом выделен порядок числа, длина мантиссы {{---}} 23 бита).D0  Переведем второе число в машинный вид, совершая те же действия.BB  <tex>405,87510</tex> = <tex>110010101</tex>,<tex>111000000000011010</tex>.D0.B5.D0<sub><tex>2</tex></sub> <tex>=</tex> <tex>1,10010101111000000000011010</tex>.BD.D0.B8<tex>\times</tex> <tex>10</tex><sup><tex>1000</tex></sup> В качестве мантиссы будут сохранены первые <tex>23</tex> бита после запятой т.D0е.B5_<tex>10010101111000000000011</tex>.D1 Очевидно, что порядок со смещением у второго числа будет таким же, как и у первого.87  Второе число положительное, следовательно, бит знака будет содержать ноль.D0  Итак в машинном 32-разрядном представлении второе число будет иметь вид:  <tex>0</tex><strong>10000111</strong><tex>10010101111000000000011</tex> Далее в арифметических операциях будет использоваться число <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> видимо для упрощения(хотя это не совсем корректно).B8  Порядки у слагаемых равны, поэтому пропускаем шаг выравнивания порядков и проводим вычитание мантисс по правилам двоичной арифметики.D1В компьютере этим занимается арифметический сопроцессор, встроенный в центральный процессор машины.81  <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>  Приводим полученный результат к машинному виду.D0Для этого мы должны внести поправку в порядок {{---}} уменьшить его на единицу.B5 Знак результата {{---}} положительный, следовательно, бит знака содержит ноль.D0  <tex>0</tex><strong>10000110</strong><tex>00010001010100000000000</tex>  Проверим правильность наших вычислений.BB_Переведем результат в десятичное представление.D0  Найдем реальный порядок результата, вычтя из него значение смещения <tex>127</tex><sub><tex>10</tex></sub>.B2_  <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>  Следовательно, число результата будет иметь вид: <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>.D0 === Алгоритм получения представления вещественного числа в памяти ЭВМ === <P>Покажем преобразование действительного числа для представления его в  памяти ЭВМ на примере величины типа Double.BF</P> <P>Как видно из таблицы, величина этого типа занимает в памяти <tex>8</tex> байт.D0На  рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):</P> {|class="wikitable" !Знак || Смещённый порядок || Мантисса |- |63 || 62.B0.D052 || 51.BC.D10 |}  <P>Можно заметить, что старший бит, отведенный под мантиссу, имеет номер  <tex>51</tex>, т.8Fе.D1мантисса занимает младшие <tex>52</tex> бита.82Черта указывает здесь на  положение двоичной запятой.D0Перед запятой должен стоять бит целой части  мантиссы, но поскольку она всегда равна <tex>1</tex>, здесь данный бит не требуется и  соответствующий разряд отсутствует в памяти (но он подразумевается).B8_ Значение порядка хранится здесь не как целое число, представленное в  дополнительном коде.D0Для упрощения вычислений и сравнения действительных  чисел значение порядка в ЭВМ хранится в виде <strong>смещенного числа</strong>, т.BAе.D0к  настоящему значению порядка перед записью его в память прибавляется  смещение.BEСмещение выбирается так, чтобы минимальному значению порядка  соответствовал нуль.D0Например, для типа Double порядок занимает <tex>11</tex> бит и  имеет диапазон от <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>  <tex>1111111111</tex><sub>(<tex>2</tex>)</sub>.BCНаконец, бит с номером <tex>63</tex> указывает на знак числа.D0</P> <P>Таким образом, из вышесказанного вытекает следующий <strong>алгоритм</strong> для  получения представления действительного числа в памяти ЭВМ:</P> <OL> <LI>перевести модуль данного числа в двоичную систему счисления;</LI> <LI>нормализовать двоичное число, т.BFе.D1записать в виде <I>M</I> <tex> \times </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; порядок, записанный в  десятичной системе счисления;</LI> <LI>прибавить к порядку смещение и перевести смещенный порядок в двоичную  систему счисления;</LI> <LI>учитывая знак заданного числа (0&nbsp;&#151; положительное; 1&nbsp;&#151; отрицательное),  выписать его представление в памяти ЭВМ.8C</LI> </OL> <P><B>Пример.D1</B> Запишем код числа <tex>-312</tex>,<tex>3125</tex>.8E</P> <OL> <LI>Двоичная запись модуля этого числа имеет вид <tex>100111000{,}0101</tex>.D1</LI> <LI>Имеем <tex>100111000{,}0101</tex> <tex>=</tex>  <tex>1{,}001110000101</tex><tex>\times</tex><tex>2</tex><sup><tex>8</tex></sup>.82</LI> <LI>Получаем смещенный порядок <tex>8</tex> <tex>+</tex> <tex>1023</tex> <tex>=</tex> <tex>1031</tex>.D0Далее имеем  <tex>1031</tex><sub>(<tex>10</tex>)</sub> <tex>=</tex> <tex>10000000111</tex><sub>(<tex>2</tex>)</sub>.B5</LI> <LI>Окончательно {|class="wikitable" | 1 || 10000000111 || 0011100001010000000000000000000000000000000000000000 |- | 63 || 62.D1.8052 || 51.D0.B0 http0 |}  </LI> </OL> <P>Очевидно, что более компактно полученный код стоит записать следующим  образом:C073850000000000<sub>(16)</sub>.</ruP> <P>Другой пример иллюстрирует обратный переход от кода действительного  числа к самому числу.</P> <P><B>Пример.</B> Пусть дан код 3FEC600000000000<sub>(16)</sub> или <OL> {|class="wikitable" | 0 || 01111111110 || 1100011000000000000000000000000000000000000000000000 |- | 63 || 62..52 || 51..wikipedia0 |}   <LI>Прежде всего замечаем, что это код положительного числа, поскольку в  разряде с номером <tex>63</tex> записан нуль.orgПолучим порядок этого числа:  <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</wikitex>.</LI> <LI>Числоимеет вид <tex>1</tex>,<tex>1100011</tex><tex> \times </tex><tex>2</tex><sup><tex>-1</tex></sup> или  <tex>0</tex>,<tex>11100011</tex>.</LI> <LI>Переводом в десятичную систему счисления получаем <tex>0</tex>,<tex>88671875</tex>.</LI>  </OL> == См. также ==* [[Представление символов, таблицы кодировок]]* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]] == Примечания ==<references/> == Ссылки ===== Использованные материалы ==='''На русском'''*[http://ru.wikipedia.org/wiki/%D0%A7AD%D0%B8BA%D1%81%D0%BBBF%D0%BE_BE%D0%BFBD%D0%BEB5%D0%BBBD%D0D1%BE86%D0%B2B8%D0%B8B0%D0%BDBB%D0D1%BD8C%D0%BEBD%D0%B9_B0%D1%828F_%D0%BEB7%D1D0%87B0%D0%BDBF%D0%BEB8%D1%81%D1%82%D0%B8 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%A79E%D1%82%D1%80%D0%B8%D1%8186%D0%BBB0%D1%82%D0%BE_B5%D0%BEBB%D1%8C%D0%B4BD%D1%8B%D0%B8B9_%D0%BDB8_%D0%B0BF%D1D0%80BE%D0%BDBB%D0%BE%D0%B9_B6%D0%B8%D1%82%D0%BEB5%D0%BB%D1%878C%D0%BD%D1%8B%D0%BEB9_%D1D0%81BD%D1D0%82BE%D0%B8 BB%D1%8C Википедия {{---}} Отрицательный и положительный ноль]*[http://habrahabr.ru/blogs/cpp/112953/ Хабрахабр {{---}} статья пользователя Yruslan "Что нужно знать про арифметику с плавающей запятой"]*[http://www.sgu.ru/prcnit/teach/3.php Статья Лапшевой Е.Е. "Машинная арифметика с вещественными числами"] <span style="color: red">Статья удалена</span> '''На английском'''*[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://grouper.ieee.org/groups/754 Материалы по стандарту IEEE 754 ''(англ.)'']* [http://softelectro.ru/ieee754.html Русский перевод стандарта IEEE 754]    [[Категория: Дискретная математика и алгоритмы]][[Категория: Представление информации]]
Анонимный участник

Навигация