Число с плавающей запятой: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Метки: с мобильного устройства из мобильной версии
Исправлена точка на запятую для представленных чисел
 
(не показано 20 промежуточных версий 15 участников)
Строка 1: Строка 1:
[[Файл:Число с плавающей запятой.png|250px|мини|справа|Число в форме десятичной дроби и в экспоненциальной форме]]
'''Число с плавающей запятой''' (или '''число с плавающей точкой''') — [[Экспоненциальная запись|экспоненциальная форма]] представления [[Вещественное число|вещественных (действительных) чисел]], в которой число хранится в виде мантиссы и [[Экспоненциальная запись|порядка]] ([[Показатель степени|показателя степени]]). При этом число с плавающей запятой имеет фиксированную относительную [[точность]] и изменяющуюся абсолютную. Используемое наиболее часто представление утверждено в стандарте [[IEEE 754]]. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.
'''Число с плавающей запятой''' (или '''число с плавающей точкой''') — [[Экспоненциальная запись|экспоненциальная форма]] представления [[Вещественное число|вещественных (действительных) чисел]], в которой число хранится в виде [[Экспоненциальная запись|мантиссы и порядка]] ([[Показатель степени|показателя степени]]). При этом число с плавающей запятой имеет фиксированную относительную [[точность]] и изменяющуюся абсолютную. Используемое наиболее часто представление утверждено в стандарте [[IEEE 754]]. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.


== «Плавающая запятая» и «плавающая точка» ==
== «Плавающая запятая» и «плавающая точка» ==
Строка 6: Строка 7:


== Происхождение названия ==
== Происхождение названия ==
Название «плавающая запятая» происходит от того, что запятая в позиционном представлении числа (десятичная запятая, или, для компьютеров, двоичная запятая — далее по тексту просто запятая) может быть помещена где угодно относительно цифр в строке. Это положение запятой указывается отдельно во внутреннем представлении. Таким образом, представление числа в форме с плавающей запятой может рассматриваться как компьютерная реализация [[экспоненциальная запись|экспоненциальной записи]] чисел.
Название «плавающая запятая» происходит от того, что запятая в позиционном представлении числа (десятичная запятая, или, для компьютеров, двоичная запятая) может быть помещена где угодно относительно цифр в строке. Это положение указывается отдельно во внутреннем представлении. Такое представление может рассматриваться как компьютерная реализация [[экспоненциальная запись|экспоненциальной записи]] чисел.


Преимущество использования представления чисел в формате с плавающей запятой над представлением в формате с [[Число с фиксированной запятой|фиксированной запятой]] (и [[Целое число|целыми числами]]) состоит в том, что можно использовать существенно больший диапазон значений при неизменной [[относительная точность|относительной точности]]. Например, в форме с фиксированной запятой число, занимающее {{num|6|разрядов}} в целой части и {{num|2|разряда}} после запятой, может быть представлено в виде {{num|123456.78}}. В свою очередь, в формате с плавающей запятой в тех же {{num|8|разрядах}} можно записать числа {{num|1.2345678}}; {{num|1234567.8}}; {{num|0.000012345678}}; {{num|12345678000000000}} и так далее, но для этого необходимо иметь дополнительное двухразрядное поле для записи показателей степени основания{{nbsp}}10 от{{nbsp}}0 до 16, при этом общее число разрядов составит 8+2=10.
Преимущество использования представления чисел в формате с плавающей запятой над представлением в формате с [[Число с фиксированной запятой|фиксированной запятой]] (и [[Целое число|целыми числами]]) состоит в том, что можно использовать существенно больший диапазон значений при неизменной [[относительная точность|относительной точности]]. Например, в форме с фиксированной запятой число, занимающее {{num|6|разрядов}} в целой части и {{num|2|разряда}} после запятой, может быть представлено в виде {{num|123456.78}}. В свою очередь, в формате с плавающей запятой в тех же {{num|8|разрядах}} можно записать числа {{num|1.2345678}}; {{num|1234567.8}}; {{num|0.000012345678}}; {{num|12345678000000000}} и так далее, но для этого необходимо иметь дополнительное двухразрядное поле для записи показателей степени основания{{nbsp}}10 от{{nbsp}}0 до 16, при этом общее число разрядов составит 8+2=10.
Строка 47: Строка 48:


=== Диапазон чисел, представимых в формате с плавающей запятой ===
=== Диапазон чисел, представимых в формате с плавающей запятой ===
Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 1 бит знак + 52 бита, показатель — 1 бит знак + 10 бит. Таким образом получаем диапазон точности примерно от 4,94{{e|−324}} до 1.79{{e|308}} (от 2<sup>−52</sup> × 2<sup>−1022</sup> до ~1 × 2<sup>1024</sup>). (или от 3.7{{e|-1126}} до 9.99{{e|1091}}). В стандарте [[IEEE 754]] несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения [[NaN]] (Not a Number, «не число») и +/-INF (Infinity, [[бесконечность]]), получающихся в результате операций [[Деление на ноль|деления на ноль]] или при превышении числового диапазона. Также сюда попадают [[денормализованные числа]], у которых мантисса меньше единицы. В специализированных устройствах (например, [[GPU]]) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти, выделенный под мантиссу и показатель, задаётся программно и ограничивается лишь объёмом доступной памяти ЭВМ (см. ''[[Арифметика произвольной точности]]'').
Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 1 бит знак + 52 бита, показатель — 1 бит знак + 10 бит. Таким образом получаем диапазон точности примерно от 4,94{{e|−324}} до 1,79{{e|308}} (от 2<sup>−52</sup> × 2<sup>−1022</sup> до ~1 × 2<sup>1024</sup>). (или от 3,7{{e|-1126}} до 9,99{{e|1091}}). В стандарте [[IEEE 754]] несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения [[NaN]] (Not a Number, «не число») и +/-INF (Infinity, [[бесконечность]]), получающихся в результате операций [[Деление на ноль|деления на ноль]] или при превышении числового диапазона. Также сюда попадают [[денормализованные числа]], у которых мантисса меньше единицы. В специализированных устройствах (например, [[GPU]]) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти, выделенный под мантиссу и показатель, задаётся программно и ограничивается лишь объёмом доступной памяти ЭВМ (см. ''[[Арифметика произвольной точности]]'').


<!-- ============================== Здесь будет добавлена ещё информация ===============
<!-- ============================== Здесь будет добавлена ещё информация ===============
Строка 83: Строка 84:
В отличие от чисел с [[фиксированная запятая|фиксированной запятой]], сетка чисел, которые способна отобразить арифметика с плавающей запятой, неравномерна: она более густая для чисел с малыми порядками и более редкая — для чисел с большими порядками. Но [[относительная погрешность]] записи чисел одинакова и для малых чисел, и для больших. '''''[[Машинный эпсилон|Машинным эпсилоном]]''''' называется наименьшее положительное число ε такое, что <math>1 \oplus \varepsilon \neq 1</math> (знаком <math>\oplus</math> обозначено машинное сложение). Грубо говоря, числа ''a'' и ''b'', соотносящиеся так, что <math>1 < \frac a b < 1+\varepsilon</math>, машина не различает.
В отличие от чисел с [[фиксированная запятая|фиксированной запятой]], сетка чисел, которые способна отобразить арифметика с плавающей запятой, неравномерна: она более густая для чисел с малыми порядками и более редкая — для чисел с большими порядками. Но [[относительная погрешность]] записи чисел одинакова и для малых чисел, и для больших. '''''[[Машинный эпсилон|Машинным эпсилоном]]''''' называется наименьшее положительное число ε такое, что <math>1 \oplus \varepsilon \neq 1</math> (знаком <math>\oplus</math> обозначено машинное сложение). Грубо говоря, числа ''a'' и ''b'', соотносящиеся так, что <math>1 < \frac a b < 1+\varepsilon</math>, машина не различает.


Для одинарной точности <math>\varepsilon = 2^{-24} \approx 5,96\cdot10^{-8}</math>, то есть, приблизительно 7 [[Значащие цифры|значащих цифр]]. Для двойной точности: <math>\varepsilon = 2^{-53} \approx 1,11\cdot10^{-16}</math>, 15 значащих цифр<ref>{{книга
Для одинарной точности <math>\varepsilon = 2^{-24} \approx 5,96\cdot10^{-8}</math>, то есть приблизительно 7 [[Значащие цифры|значащих цифр]]. Для двойной точности: <math>\varepsilon = 2^{-53} \approx 1,11\cdot10^{-16}</math>, 15 значащих цифр<ref>{{книга
| автор = E. Cheney, David Kincaid
| автор = E. Cheney, David Kincaid
| заглавие = Numerical Mathematics and Computing
| заглавие = Numerical Mathematics and Computing
Строка 134: Строка 135:
* [https://habrahabr.ru/post/112953/ Что нужно знать про арифметику с плавающей запятой]
* [https://habrahabr.ru/post/112953/ Что нужно знать про арифметику с плавающей запятой]


{{нет сносок}}
{{нет сносок|дата=2015-02-06}}
{{Типы данных}}
{{Типы данных}}



Текущая версия от 14:30, 2 сентября 2024

Число в форме десятичной дроби и в экспоненциальной форме

Число с плавающей запятой (или число с плавающей точкой) — экспоненциальная форма представления вещественных (действительных) чисел, в которой число хранится в виде мантиссы и порядка (показателя степени). При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Используемое наиболее часто представление утверждено в стандарте IEEE 754. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.

«Плавающая запятая» и «плавающая точка»

[править | править код]

Так как в некоторых, преимущественно англоязычных и англофицированных странах при записи чисел целая часть отделяется от дробной точкой, то в терминологии этих стран фигурирует название «плавающая точка» (англ. floating point). Так как в России целая часть числа от дробной традиционно отделяется запятой, то для обозначения того же понятия исторически используется термин «плавающая запятая», однако в настоящее время в русскоязычной литературе и технической документации можно встретить оба варианта.

Происхождение названия

[править | править код]

Название «плавающая запятая» происходит от того, что запятая в позиционном представлении числа (десятичная запятая, или, для компьютеров, двоичная запятая) может быть помещена где угодно относительно цифр в строке. Это положение указывается отдельно во внутреннем представлении. Такое представление может рассматриваться как компьютерная реализация экспоненциальной записи чисел.

Преимущество использования представления чисел в формате с плавающей запятой над представлением в формате с фиксированной запятойцелыми числами) состоит в том, что можно использовать существенно больший диапазон значений при неизменной относительной точности. Например, в форме с фиксированной запятой число, занимающее 6 разрядов в целой части и 2 разряда после запятой, может быть представлено в виде 123 456,78. В свою очередь, в формате с плавающей запятой в тех же 8 разрядах можно записать числа 1,2345678; 1 234 567,8; 0,000012345678; 12 345 678 000 000 000 и так далее, но для этого необходимо иметь дополнительное двухразрядное поле для записи показателей степени основания 10 от 0 до 16, при этом общее число разрядов составит 8+2=10.

Скорость выполнения компьютером операций с числами, представленными в форме с плавающей запятой, измеряется во FLOPS (от англ. floating-point operations per second — «[количество] операций с плавающей запятой в секунду») и является одной из основных единиц измерения быстродействия вычислительных систем.

Структура числа

[править | править код]

Число с плавающей запятой состоит из следующих частей:

  • знак мантиссы (указывает на отрицательность или положительность числа),
  • мантисса (выражает значение числа без учёта порядка),
  • знак порядка,
  • порядок (выражает степень основания числа, на которое умножается мантисса).

Нормальная и нормализованная формы

[править | править код]

Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале , то есть .

Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать как 0,000001⋅102, 0,00001⋅101, 0,0001⋅100, 0,001⋅10−1, 0,01⋅10−2 и так далее), поэтому распространена (особенно в информатике) также другая форма записи — нормализованная, в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (исключительно), то есть (аналогично, мантисса двоичного числа принимает значения от 1 до 2). В такой форме любое число (кроме ) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить 0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа 0.

Старший разряд (целая часть числа) мантиссы двоичного числа (кроме 0) в нормализованном виде равен 1 (так называемая неявная единица), поэтому при записи мантиссы числа в ЭВМ старший разряд можно не записывать, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем 2 (в троичной, четверичной и др.), этого свойства нет.

Способы записи

[править | править код]

При ограниченных возможностях оформления (например, отображение числа на семисегментном индикаторе), а также при необходимости обеспечить быстрый и удобный ввод чисел, вместо записи вида m·be (m — мантисса; b — основание, чаще всего 10; e — экспонента), записывают лишь мантиссу и показатель степени, разделяя их буквой «E» (от англ. exponent). Основание при этом неявно полагают равным 10. Например, число 1,528535047⋅10−25 в этом случае записывается как 1.528535047E-25.

Краткий обзор

[править | править код]

Существует несколько способов того, как строки из цифр могут представлять числа:

  • Наиболее распространённый путь представления значения числа из строки с цифрами — в виде целого числа — запятая (radix point) по умолчанию находится в конце строки.
  • В общем математическом представлении строка из цифр может быть сколь угодно длинной, а положение запятой обозначается путём явной записи символа запятой (или точки) в нужном месте.
  • В системах с представлением чисел в формате с фиксированной запятой существует определённое условие относительно положения запятой. Например, в строке из 8 цифр условие может предписывать положение запятой в середине записи (между 4-й и 5-й цифрой). Таким образом, строка «00012345» обозначает число 1,2345 (нули слева всегда можно отбросить).
  • В экспоненциальной записи используют стандартный (нормализованный) вид представления чисел. Число считается записанным в стандартном (нормализованном) виде, если оно записано в виде , где , называемое мантиссой, такое, что ,  — целое, называется показатель степени и  — целое, основание системы счисления (на письме это обычно 10). То есть в мантиссе запятая помещается сразу после первой значащей (не равной нулю) цифры, считая слева направо, а дальнейшая запись даёт информацию о действительном значении числа. Например, период обращения (на орбите) спутника Юпитера Ио, который равен 152 853,5047 с, в стандартном виде можно записать как 1,528535047⋅105 с. Побочным эффектом ограничения на значения мантиссы является то, что в такой записи невозможно изобразить число 0.
  • Запись в форме с плавающей запятой похожа на запись чисел в стандартном виде, но мантисса и экспонента записываются раздельно. Мантисса записывается в нормализованном формате — с фиксированной запятой, подразумеваемой после первой значащей цифры. Возвращаясь к примеру с Ио, запись в форме с плавающей запятой будет иметь мантиссу 1,528535047 и показатель 5. Это означает, что имеется в виду число в 105 раз больше числа 1,528535047, то есть для получения подразумеваемого числа запятая сдвигается на 5 разрядов вправо. Однако, запись в форме с плавающей запятой используется в основном в электронном представлении чисел, при котором используется основание системы счисления 2, а не 10. Кроме того, в двоичной записи мантисса обычно денормализована, то есть запятая подразумевается до первой цифры, а не после, и целой части вообще не имеется в виду — так появляется возможность и значение 0 сохранить естественным образом. Таким образом, десятичная 9 в двоичном представлении с плавающей запятой будет записана как мантисса +1001000…0 и показатель +0…0100. Отсюда, например, беды с двоичным представлением чисел типа одной десятой (0,1), для которой двоичное представление мантиссы оказывается периодической двоичной дробью — по аналогии с 1/3, которую нельзя конечным количеством цифр записать в десятичной системе счисления.

Запись числа в форме с плавающей запятой позволяет производить вычисления над широким диапазоном величин, сочетая фиксированное количество разрядов и точность. Например, в десятичной системе представления чисел с плавающей запятой (3 разряда) операцию умножения, которую мы бы записали как

0,12 × 0,12 = 0,0144

в нормальной форме представляется в виде

(1,20⋅10−1) × (1,20⋅10−1) = (1,44⋅10−2).

В формате с фиксированной запятой мы бы получили вынужденное округление

0,120 × 0,120 = 0,014.

Мы потеряли крайний правый разряд числа, так как данный формат не позволяет запятой «плавать» по записи числа.

Диапазон чисел, представимых в формате с плавающей запятой

[править | править код]

Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 1 бит знак + 52 бита, показатель — 1 бит знак + 10 бит. Таким образом получаем диапазон точности примерно от 4,94⋅10−324 до 1,79⋅10308 (от 2−52 × 2−1022 до ~1 × 21024). (или от 3,7⋅10-1126 до 9,99⋅101091). В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы. В специализированных устройствах (например, GPU) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти, выделенный под мантиссу и показатель, задаётся программно и ограничивается лишь объёмом доступной памяти ЭВМ (см. Арифметика произвольной точности).

Точность Одинарная Двойная Расширенная
Размер (байты) 4 8 10
Число десятичных знаков ~7.2 ~15.9 ~19.2
Наименьшее значение (>0), denorm 1,4⋅10−45 4,9⋅10−324 3,7⋅10−1126
Наименьшее значение (>0), normal 1,2⋅10−38 2,3⋅10−308 1⋅10−1091
Наибольшее значение 3,4×10+38 1,7×10+308 9,9×10+1091
Поля S-E-F S-E-F S-E-I-F
Размеры полей 1-8-23 1-11-52 1-15-1-63
  • S — знак, E — показатель степени, I — целая часть, F — дробная часть
  • Так же, как и для целых, знаковый бит — старший.

Машинный эпсилон

[править | править код]

В отличие от чисел с фиксированной запятой, сетка чисел, которые способна отобразить арифметика с плавающей запятой, неравномерна: она более густая для чисел с малыми порядками и более редкая — для чисел с большими порядками. Но относительная погрешность записи чисел одинакова и для малых чисел, и для больших. Машинным эпсилоном называется наименьшее положительное число ε такое, что (знаком обозначено машинное сложение). Грубо говоря, числа a и b, соотносящиеся так, что , машина не различает.

Для одинарной точности , то есть приблизительно 7 значащих цифр. Для двойной точности: , 15 значащих цифр[1].

Примечания

[править | править код]
  1. E. Cheney, David Kincaid. Numerical Mathematics and Computing. — Cengage Learning, 2012. — 43– p. — ISBN 1-133-71235-5.

Литература

[править | править код]
  •  Криницкий Н. А., Миронов Г. А., Фролов Г. Д. Программирование. — М.: Государственное издательство физико-математической литературы, 1963. — 384 с.
  • Генри С. Уоррен, мл. Глава 15. Числа с плавающей точкой // Алгоритмические трюки для программистов = Hacker’s Delight. — М.: Вильямс, 2007. — С. 288. — ISBN 0-201-91465-4.