Числа с плавающей точкой
| English | Русский |
|---|---|
| floating-point/ˈfləʊtɪŋ pɔɪnt/ | числа с плавающей точкой |
| mantissa/mænˈtɪsə/ | мантисса |
| exponent/ekˈspəʊnənt/ | показателе степени |
| normalised/ˈnɔːməlaɪzd/ | нормализованный |
| precision/prɪˈsɪʒn/ | точность (прецизионность) |
| rounding errors/ˈraʊndɪŋ ˈerəz/ | ошибки округления |
| fixed-point/fɪkst pɔɪnt/ | числа с фиксированной точкой |
| overflow/ˌəʊvəˈfləʊ/ | переполнение |
| underflow/ˌʌndəˈfləʊ/ | переполнение вниз (underflow) |
Ракета, пролетевшая в обход на 600 метров
- 25 февраля 1991 года батарея «Пэтриот» в Дхаране не перехватила Serif missile. Погибло 28 солдат.
- Система считала время в десятых долях секунды, а 0.1 не имеет точного двоичного представления: это периодическая дробь, усеченная до разрядности регистра. Каждый тик терял долю микросекунды.
- После ста часов работы накопленная ошибка составила треть секунды, а за треть секунды цель сместилась на 600 метров. Арифметика была верна на каждом шаге.
- Этот урок касается формата с плавающей запятой, нормализации и ошибок приближения, которые делают подобные случаи возможными.
Формат
- Для хранения вещественных чисел очень разного порядка компьютер использует двоичное представление научной нотации с двумя полями: мантисса (значащие цифры) и экспонента (степень 2, на которую нужно умножить). Оба значения хранятся в дополнительном коде.
- Читайте мантиссу как двоичную дробь: первый бит после точки равен $\tfrac12$, следующий $\tfrac14$, затем $\tfrac18$. Так
0.1010000равно $\tfrac12 + \tfrac18 = 0.625$. - С экспонентой
00000010, что равно $+2$, значение составляет $0.625 \times 2^2 = 2.5$.

Дробь и степень двойки
Построение числа с плавающей точкой
Перевернуть биты мантиссы и экспоненты, чтобы получить значение, и проверить, нормализовано ли оно.
Число с плавающей точкой хранится как:
значение = мантисса × 2^экспонента — двоичная научная нотация, где обе части хранятся в дополнении до двух.
Сопоставьте каждую часть представления числа с плавающей точкой с её ролью.
значение = мантисса × 2^экспонента; нормализация максимизирует точность; деньги используют фиксированную точку/BCD, чтобы избежать округления.
Разбор примера: перевод из двоичной системы в десятичную
- Число имеет мантиссу
10110000и экспоненту00000011. Найдите его десятичное значение. - Экспонента равна $+3$. Мантисса начинается с 1, поэтому она отрицательная и читается по правилам дополнительного кода: как
1.0110000знаковый бит имеет вес $-1$, а биты дробной части добавляют $\tfrac14 + \tfrac18 = 0.375$, так что мантисса равна $-1 + 0.375 = -0.625$. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- Наиболее частая ошибка — чтение отрицательной мантиссы так, будто она положительна. Проверяйте первый бит прежде всего.
У числа с плавающей точкой мантисса 10110000 и экспонента 00000011. Каково его десятичное значение?
Мантисса начинается с 1, значит она отрицательная: −1 + 1/4 + 1/8 = −0.625. Умножение на 2^3 даёт −5.0. Чтение её как положительной — типичная ошибка.
Разобранное решение: десятичная в двоичную
- Сохранить $+2.5$ в том же формате 8-битной мантиссы и 8-битного показателя.
- В двоичном виде $2.5 = 10.1$. Записанная как дробь, умноженная на степень двойки: $2.5 = 0.101 \times 2^2$.
- Таким образом, мантисса равна
01010000: знаковый бит 0, затем.101, дополненный нулями, а показатель равен00000010. - Всегда сначала записывайте в нормализованной форме; тогда оба поля считываются напрямую.
Записанное как нормализованная дробь, умноженная на степень двойки, 2.5 = 0.101 x 2^__. Укажите экспоненту.
2.5 — это 10.1 в двоичной системе; сдвиг запятой на два места влево дает 0.101, так что экспонента равна 2, а мантисса — 01010000.
Нормализация
- Число является нормализованным, когда первая значащая бита находится сразу после двоичной точки, то есть нет лишних ведущих нулей. Для положительного числа мантисса начинается с
0.1; для отрицательного — с1.0. - Почему: это максимизирует точность, поскольку каждая бита мантиссы несет информацию, а не ведущий ноль.
- Чтобы нормализовать число, сдвиньте мантиссу влево и уменьшите показатель на то же количество позиций, или сдвиньте вправо и увеличьте его. Значение остается неизменным; меняется только представление.

Сдвигайте биты, корректируйте показатель, сохраняйте значение
Компромисс между битами мантиссы и показателя
- Общее количество бит фиксировано, поэтому два поля конкурируют друг с другом.
- Больше бит мантиссы означает большую точность: каждое значение хранится более точно, с меньшей ошибкой округления.
- Больше бит показателя означает больший диапазон: можно представлять гораздо большие и меньшие величины, но каждая из них будет менее точной.
- Вопрос о влиянии переноса бита из одного поля в другое требует именно этого компромисса: диапазон против точности.
Нормализация числа с плавающей точкой
Процесс нормализации. Сдвиг мантиссы для удаления бесполезных ведущих нулей — и корректировка экспоненты для сохранения значения — сохраняет само число, но тратит каждый бит на точность.
Нормализация числа с плавающей точкой:
Нормализация сдвигает мантиссу так, чтобы первый значащий бит следовал за точкой — тогда каждый бит несёт информацию, а значение остается неизменным.
Что верно при нормализации числа с плавающей точкой? Выберите все подходящие варианты.
Нормализация меняет только представление. Значение остается неизменным; именно это гарантирует корректировка экспоненты.
Приближение и его последствия
- Многие десятичные вещественные числа не могут быть сохранены точно в двоичном виде. $0.1$ — это повторяющаяся дробь $0.000110011\ldots$, поэтому ее необходимо обрезать: сохраненное значение близко к $0.1$, но никогда ему не равно.
- Ошибки округления накапливаются при многих операциях, вот почему
0.1 + 0.2не точно равно0.3и почему часы «Патриота» отклонялись. - Поэтому никогда не проверяйте равенство двух вещественных чисел: пишите
ABS(x - 0.3) < 1e-9вместоx = 0.3. И остерегайтесь вычитания двух почти равных значений, так как это приводит к потере большинства значащих цифр. - Для значений, требующих точности, прежде всего для валюты, используйте фиксированную запятую или BCD вместо плавающей.
Сопоставьте каждое изменение распределения битов с его эффектом.
Размер слова фиксирован, поэтому точность и диапазон компромиссируют друг с другом; переполнение вверх и вниз — это исчерпание поля экспоненты на каждом конце.
Переполнение и недополнение
- Переполнение происходит, когда результат слишком велик для диапазона показателя, поэтому он вообще не может быть представлен.
- Недополнение происходит, когда результат слишком мал, слишком близок к нулю, что показатель не может опуститься достаточно низко, и оно округляется до нуля.
- Оба явления являются свойствами размера поля показателя, которое является второй стороной компромисса, упомянутого выше.
0.1 нельзя сохранить точно в двоичной системе (это периодическая дробь), поэтому 0.1 + 0.2 не дает точно 0.3 на компьютере.
Мелкие ошибки приближения накапливаются — вот почему деньги обрабатываются с помощью фиксированной точки или BCD, а не чисел с плавающей точкой.
Для точных денежных вычислений следует использовать:
Ошибки округления чисел с плавающей запятой недопустимы для финансовых операций; фиксированная точка или BCD хранят десятичные значения точно.
Потерянные баллы
- Мантисса — это дробь, а не целое число: первый бит после точки равен половине.
- Мантисса, начинающаяся с 1, является отрицательной и следует правилам дополнения до двух. Сначала проверьте этот бит.
- Нормализация максимизирует точность; она не меняет значение и не делает число больше.
- Больше мантиссы означает точность, больше показателя означает диапазон. Переполнение — слишком много, недополнение — слишком мало.
Вы поняли
- Дробно-точечная запись хранит $\text{mantissa} \times 2^{\text{exponent}}$, оба значения в дополнении до двух; мантисса представляет собой двоичную дробь
- преобразование путем чтения мантиссы как дроби (дополнение до двух, если начинается с 1) и умножения на две в степени показателя
- нормализованное означает, что первая значащая бита находится сразу после точки, что максимизирует точность; сдвиг влево снижает показатель
- больше бит мантиссы дают точность, больше бит показателя дают диапазон; двоичная система не может точно хранить многие вещественные числа, поэтому ожидайте ошибок округления, сравнивайте с допуском и используйте фиксированную запятую или BCD для валюты