Числа с фиксированной запятой
Есть два способа хранения вещественных чисел в памяти ЭВМ: с фиксированной и с плавающей запятой.
Число с фиксированной запятой — формат представления вещественного числа в памяти ЭВМ в виде целого числа. При этом само число x и его целочисленное представление x′ связаны формулой x = x′ ⋅ z, где z — цена (вес) младшего разряда. Простейший пример арифметики с фиксированной запятой — перевод рублей в копейки. В таком случае, чтобы запомнить сумму 12 рублей 34 копейки, мы записываем в ячейку памяти число 1234.
Применение
- для ускорения вычислений в местах, где не требуется высокая точность. В большинстве современных процессоров ФЗ аппаратно не реализована, но даже программная ФЗ очень быстра.
- минимальная поддержка дробных чисел на целочисленном процессоре (микроконтроллеры, мобильные телефоны, приставки вплоть до Playstation).
- для записи чисел, которые по своей природе имеют постоянную абсолютную погрешность: координаты в программах вёрстки, денежные суммы.
Фиксированная запятая ведёт себя абсолютно предсказуемо — при подсчёте денег это позволяет наладить разные виды округления.
Недостаток фиксированной запятой — очень узкий диапазон чисел, с угрозой переполнения на одном конце диапазона и потерей точности вычислений на другом.
Например, если нужна точность в 3 значащих цифры, то 4-байтовая фиксированная запятая позволяет использовать диапазон чисел, различающихся приблизительно на 106 между самым большим и самым маленьким числом, а 4-байтовое число с плавающей запятой — в 1070.
Эта проблема и привела к изобретению плавающей запятой.
Числа с плавающей точкой (запятой)
Плавающая запятая — форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале [0; 1) (0<=a<1). Число с плавающей запятой, находящееся не в нормальной форме, теряет точность по сравнению с нормальной формой. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно
Например: 0,0001 можно записать в 4 формах — 0,0001×100,
0,001×10−1,
0,01×10−2,
0,1×10−3),
поэтому распространена (особенно в информатике) также другая форма записи — нормализованная, в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (не включительно), а мантисса двоичного числа принимает значения от 1 (включительно) до 2 (не включительно) (1<=a<q). В такой форме любое число (кроме 0) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить 0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа 0. При этом число с плавающей запятой в нормальной форме имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто используемое представление утверждено в стандарте IEEE 754. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная. Для хранения в двоичном коде вещественных чисел необходимо произвести нормализацию двоичных чисел: X=S⋅M⋅2^E.
Стандарт описывает формат хранения мантиссы, показателя и знака, форматы положительного и отрицательного нуля, плюс и минус бесконечностей, а также определение «не числа» (NaN).
Число в памяти выглядит так:
- бит S используется для хранения знака числа
- биты E используются для хранения экспоненты числа
- биты M используются для хранения мантиссы числа
Точность числа | Размер, байт | Мантисса, бит | Порядок (экспонента), бит | Порядок числа, степеней десятки | Точность, десятичных знаков |
половинная | от 10−4 до 104 | ||||
одинарная | от 10−38 до 1038 | ||||
двойная | от 10−307 до 10307 | ||||
четверная | от 10−4931 до 104931 |
Число двойной точности (Double precision, double)
Для вычисления экспоненты из 11-ти битного числа вычитается 10-ти битное смещение экспоненты, равное 11111111112=102310. Для вычисления мантиссы к 1,0 добавляется поле мантиссы в виде дробной части. Число равно произведению мантиссы со знаком на двойку в степени экспоненты.