Что такое числа с плавающей запятой?

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

числа с плавающей запятой

Точка или запятая

В подробном списке Decimal separator указаны те англоязычные и англофицированные страны, где в записях чисел дробная часть отделяется от целой части точкой, и потому терминологией этих стран принято название floating point - "плавающая точка". В Российской Федерации дробная часть от целой по традиции отделяется запятой, поэтому обозначает это же понятие исторически признанный термин "числа с плавающей запятой". Тем не менее, сегодня в технической документации и в русскоязычной литературе вполне допускаются оба эти варианта.

Термин "числа с плавающей запятой" произошёл от того, что позиционное представление числа представляет запятую (обычную десятичную или двоичную - компьютерную), которая может поместиться где угодно среди цифр строки. Такую её особенность обязательно оговаривают отдельно. Это значит, что представление чисел с плавающей запятой можно рассматривать как компьютерную реализацию экспоненциальной записи числа. Преимуществом использования такого представления над представлением формата с фиксированной запятой и целыми числами в том, что диапазон значений прирастает существенно при том, что относительная точность остаётся неизменной.

Пример

Если запятая в числе фиксированная, то записать его можно только одним форматом. Например, дано шесть разрядов целого в числе и два разряда в дробной части. Это можно сделать только таким образом: 123456,78. Формат чисел с плавающей запятой даёт полный простор для выражения. Например, даны те же самые восемь разрядов. Вариантов записи может быть сколько угодно, если программист не манкирует обязанностью завести двухразрядное дополнительное поле, где будет записывать показатели степени, которые обычно 10, от 0 и до 16, а разрядов при этом общим числом будет десять: 8+2.

Некоторые варианты записи, которые позволяет формат чисел с плавающей запятой: 12345678000000000000; 0,0000012345678; 123,45678; 1,2345678 и так далее. У данного формата есть даже единица измерения скорости! Вернее, быстродействия вычислительной системы, которая фиксирует скорость, с которой компьютер выполняет операции, где присутствует представление чисел с плавающей запятой. Измеряется это быстродействие в единицах FLOPS (floating-point operations per second, что переводится как количество операций в секунду с числами с плавающей запятой). Эта единица является основной в измерении скорости вычислительной системы.

формат чисел с плавающей запятой

Структура

Записать число в формате с плавающей запятой нужно следующим образом, соблюдая последовательность обязательных частей, поскольку эта запись является экспоненциальной, где представлены действительные числа как мантисса и порядок. Это необходимо для представления слишком больших и слишком малых чисел, их гораздо удобнее читать. Обязательные части: записываемое число (N), мантисса (M), знак порядка (p) и порядок (n). Два последних знака образуют характеристику числа. Значит, N = M . np. Так записываются числа с плавающей запятой. Примеры будут разнообразны.

1. Нужно записать числом один миллион так, чтобы не запутаться в нулях. 1000000 - это нормальная запись, арифметическая. А компьютерная выглядит так: 1,0 . 106. То есть, десять в шестой степени - три знака, в которые поместились целых шесть нулей. Таким образом и происходит представление чисел с фиксированной и плавающей запятой, где сразу же можно обнаружить различия в написании.

2. А такое трудное число, как 1435000000 (один миллиард четыреста тридцать пять тысяч) тоже просто может быть записано: 1,435 . 109, всего лишь. Так же и со знаком минус можно записать любое число. Вот этим и отличаются друг от друга числа с фиксированной и плавающей запятой.

Но это большие числа, как быть с малыми? Да тоже легко.

3. Например, как обозначить одну миллионную? 0,000001 = 1,0 . 10-6. Значительно облегчаются и написание числа, и его прочтение.

4. А посложнее? Пятьсот сорок шестая миллиардная: 0,000000546 = 546 . 10-9. Вот. Диапазон представления чисел с плавающей запятой очень широк.

представление чисел с плавающей запятой

Форма

Форма числа может быть нормальной или нормализованной. Нормальная - всегда соблюдает точность чисел с плавающей запятой. Нужно отметить, что мантисса в этой форме, не учитывая знак, находится на половине интервала: 0 1, значит, 0 ⩽ a < 1. Не в нормальной форме число свою точность теряет. Недостатком нормальной формы числа является то, что многие числа можно записывать разными способами, то есть неоднозначно. Пример разной записи одного и того же числа: 0,0001 = 0, 000001 . 102 = 0,00001 . 101 = 0,0001 . 100 = 0,001 . 10-1 = 0,01 . 10-2 и так можно ещё много. Именно поэтому в информатике используется другая, нормализованная форма записи, где мантисса десятичных чисел принимает значение от единицы (включительно) и таким образом до десяти (не включительно), и таким же образом мантисса двоичных чисел принимает значение от единицы (включительно) до двойки (не включительно).

Значит, 1 ⩽ a < 10. Это - двоичные числа с плавающей запятой, и данная форма записи любое число (кроме ноля) фиксирует единственным образом. Но тоже есть недостаток - невозможность в этом виде представить ноль. Поэтому информатикой предусматривается для числа 0 употребление специального признака (бит). Целая часть числа (старший разряд) мантиссы в двоичном числе кроме нуля в нормализованной форме равна 1 (неявная единица). Такая запись используется стандартом IEEE 754. Позиционные системы счисления, где основание больше двух (троичная, четверичная и другие системы), это свойство не приобрели.

записать число в формате с плавающей запятой

Вещественные числа

Вещественные числа с плавающей запятой обычно только и бывают, поскольку это не единственный, но очень удобный способ представления действительного числа, как бы компромисс между диапазоном значений и точностью. Это аналог экспоненциальной записи, только выполненной в компьютере. Число с плавающей запятой - набор из отдельных двоичных разрядов, разделяющихся на знак (sign), порядок (exponent) и мантиссу (mantis). Самый распространённый формат IEEE 754 представляет число с плавающей запятой как набор битов, которые кодируют одной своей частью мантиссу, другой частью - степень, и одним битом указывается знак числа: ноль - это если оно положительное, единица - если число отрицательное. Весь порядок записывается целым числом (код со сдвигом), а мантисса - в нормализованной форме, её дробная часть - в двоичной системе.

Каждый знак - это один бит, который указывает знак для полностью числа с плавающей точкой. Мантисса и порядок - числа целые, они вкупе со знаком и делают представление числа с плавающей запятой. Порядок можно называть экспонентой или показателем степени. Далеко не все вещественные числа можно представить в компьютере в их точном значении, остальные же представляются значениями приближёнными. Гораздо более простой вариант - представить вещественное число с фиксированной точкой, где вещественная и целая части будут храниться отдельно. Вероятнее всего, таким образом, чтобы целой части отводилось всегда Х бит, а дробной - Y бит. Но архитектуры процессоров не знают такого способа, а потому предпочтение отдаётся числу с плавающей запятой.

диапазон представления чисел с плавающей запятой

Сложение

Сложение чисел с плавающей запятой довольно просто. В связи со стандартом IEEE 754 одинарная точность числа имеет огромное количество бит, поэтому лучше сразу переходить к примерам, причём лучше взять наименьшее представление числа с плавающей запятой. Например, два числа - X и Y.

ПеременнаяЗнакЭкспонентаМантисса
X01001110
Y00111000

Шаги будут следующими:

а) Числа нужно представить в нормированном виде. Явно представляется скрытая единица. Х = 1,110 . 22, а Y = 1,000 . 20.

б) Продолжить процесс сложения можно, только уравняв экспоненты, а для этого нужно переписать значение Y. Оно будет соответствовать значению нормализованного числа, хотя фактически - денормализуется.

Вычислить разность экспонент степени 2 - 0 = 2. Теперь сдвинуть мантиссу для компенсации этих изменений, то есть добавить 2 к показателю второго слагаемого, сдвинув таким образом запятую скрытой единицы на два пункта влево. Получается 0,0100 . 22. Это и будет эквивалент прежнему значению Y, то есть уже Y'.

в) Теперь нужно сложить мантиссы числа Х и скорректированного Y.

1,110 + 0,01 = 10,0

Экспонента всё ещё равна представленному показателю Х, которая равна 2.

г) Сумма, полученная на предыдущем этапе, сместила единицу нормализации, значит, нужно сдвинуть экспоненту и суммирование повторить. 10,0 с двумя битами слева от запятой, теперь число нужно нормализовать, то есть, переместить запятую влево на один пункт, а экспоненту соответственно увеличить на 1. Получается 1,000 . 23.

д) Пришла пора конвертировать число с плавающей запятой в однобайтную систему.

СуммаЗнакЭкспонентаМантисса
X + Y01010000

Вывод

Как видно, складывать такие числа не слишком сложно, ничего, что запятая плавает. Если, конечно, не считать приведение числа с меньшей экспонентой к числу с большей (в приведённом примере это были Y к Х), а также восстановление статус-кво, то есть выдача компенсации - передвижение запятой мантиссы влево. Когда сложение уже произведено, очень возможна и ещё одна сложность - перенормирование и усечение бит, если их количество не соответствует формату числа для его представления.

умножение чисел с плавающей запятой

Умножение

Двоичная система счисления предлагает два способа, с помощью которых производится умножение чисел с плавающей запятой. Эта задача может быть выполнена умножением, которое начинается с младших разрядов и которое начинается со старших разрядов в множителе. Оба случая содержат целый ряд операций, последовательно складывающий частные произведения. Эти операции сложения управляются разрядами множителя. Значит, если в одном из разрядов множителя есть единица, то сумма частных произведений прирастает множимым с соответственным сдвигом. А если в разряд множителя прокрался ноль, тогда множимое не прибавляется.

Если производится умножение просто двух чисел, то цифры произведения в своём количестве не могут превышать количество цифр, содержащихся в сомножителях, более чем в два раза, и при больших числах это очень и очень много. Если же умножается несколько чисел, то произведение рискует не поместиться на экран. Потому число разрядов любого цифрового автомата является вполне конечным, и это вынуждает ограничиться как максимум удвоенным количество цифр сумматоров. А если количество разрядов ограничивается, в произведение неизбежно вносится погрешность. Если же объём вычислений велик, то погрешности накладываются, и в результате сильно возрастает общая погрешность. Здесь единственный выход - округлить результаты умножения, тогда погрешность произведения получится знакопеременной. Когда выполняется операция умножения, появляется возможность выйти за пределы сетки разрядов, но только со стороны младших, поскольку действует ограничение, наложенное на числа, которые представлены в форме с запятой фиксированной.

Некоторые пояснения

Начать лучше сначала. Самый распространённый путь представления числа - строкой цифр как целое число, где запятая подразумевается в самом конце. Строка эта может быть хоть какой длины, а запятая стоит в самом нужном для неё месте, отделяя целое число от дробной части его. Формату представления числа с фиксированной запятой система обязательно ставит определённые условия по поводу местоположения запятой. Экспоненциальная запись пользуется стандартным нормализованным видом представления чисел. Это a q n {\displaystyle aq^{n}} aqn. Здесь а {\displaystyle a}a, и называется это кружево мантиссой. Как раз об этом было сказано, что 0 ⩽ a < q. Далее всё должно быть уже понятно: n {/displaystyle n}n - целое, показатель степени, а q {/displaystyle q}q - тоже целое, являющееся основанием данной системы счисления (а в письме это чаще всего 10). Мантисса оставит запятую после первой же цифры, которая не ноль, а вот дальше по записи передаётся информация о настоящем значении числа.

Число с плавающей запятой очень похоже записывается на всем понятную стандартную запись чисел, только экспонента и мантисса записаны отдельно. Последняя к тому же и в нормализованном формате - с фиксированной запятой, которая украшает первую значащую цифру. Просто плавающая запятая используется в основном в компьютерном, то есть в электронном представлении, где система не десятичная, а двоичная, где даже мантисса денормализована переставлением запятой - теперь она перед первой цифрой, значит, до, а не после неё, там, где целой части в принципе может не быть. Например, наша родная десятичная система отдаст свою девятку двоичной системе на временное пользование. А та и запишет её мантиссой с плавающей запятой вот так: +1001000...0, а к ней и показатель +0...0100. Зато десятичная система не сумеет производить такие сложные вычисления, какие возможны в двоичной, используя форму с плавающей запятой.

числа с плавающей запятой примеры

Длинная арифметика

В электронных вычислительных машинах есть встроенные программные пакеты, где выделенный под мантиссу и показатель степени объём памяти задан программно, ограничиваясь лишь величиной памяти ЭВМ. Так выглядит длинная арифметика, то есть простые операции над числами, которые выполняет вычислительная машина. Это всё те же - вычитание и сложение, деление и умножение, элементарные функции и возведение в корень. Но только числа совсем другие, их разрядность может значительно превышать длину машинного слова. Реализация таких операций происходит не аппаратным путём, а программным, но широко используются базовые аппаратные средства в работе с числами значительно меньших порядков. Существует ещё и арифметика, где длина чисел ограничивается единственно объёмом памяти - произвольной точности арифметика. А длинную арифметику применяют во многих областях.

1. Для составления кода (процессоры, микроконтроллеры с низкой разрядностью - в 10 бит и восьмибитными регистрами разрядности, этого явно недостаточно, чтобы обрабатывать информацию с Analog-to-digital (Аналого-цифровой преобразователь), а потому не обойтись без длинной арифметики.

2. Также длинная арифметика используется для криптографии, где нужно обеспечение точности результата возведения в степень или умножения до 10309. Целочисленная арифметика используется по модулю m - большого натурального числа, и вовсе не обязательно простого.

3. Программное обеспечение для финансистов и математиков тоже не обходится без длинной арифметики, потому что только так можно сверить результаты вычислений на бумаге - с помощью компьютера, обеспечивая высокую точность чисел. Плавающей запятой они могут привлекать сколько угодно длинную разрядность. А вот инженерные расчёты и работа учёных достаточно редко требуют вмешательства программных вычислений, потому что очень сложно внести входные данные, не допустив ошибок. Обычно они гораздо объёмнее, чем результаты округления.

Борьба с погрешностями

При операциях с числами, в которых плавает запятая, очень сложно оценивать погрешность результатов. Пока не придумано удовлетворяющей всех математической теории, которая помогла бы решить этот вопрос. А вот погрешности с целыми числами оценить легко. Возможность избавления от неточностей лежит на поверхности - просто использовать только числа с запятой фиксированной. Например, финансовые программы построены именно по этому принципу. Однако там проще: необходимое количество разрядов после запятой заранее известно.

Другие приложения не могут ограничиться этим, потому что невозможна работа ни с очень малыми, ни с очень большими числами. Поэтому при работе всегда учитывается, что неточности возможны, и потому при выводе результатов нужно обязательно округлять. Причём, автоматическое округление зачастую является действием недостаточным, а поэтому округление задаётся специально. Очень опасна в этом отношении операция сравнения. Здесь даже оценить размер будущих погрешностей чрезвычайно сложно.

Статья закончилась. Вопросы остались?
Комментарии 0
Подписаться
Я хочу получать
Правила публикации
Редактирование комментария возможно в течении пяти минут после его создания, либо до момента появления ответа на данный комментарий.