"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Вещественные числа нужны программам для вычислений с дробями и величинами, которые могут сильно различаться по размеру. Чтобы хранить их в ограниченной памяти, компьютер использует форму с плавающей точкой: число кодируется знаком, мантиссой и порядком. Такой способ охватывает широкий диапазон значений, но конечного количества битов не хватает для точной записи многих чисел. Поэтому при сохранении и вычислениях появляются округления, которые могут влиять на результат.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Вещественное число — число, которое компьютер приближённо представляет конечным набором двоичных разрядов. К таким числам относятся целые, дробные и отрицательные значения. Ограничение числа разрядов нужно учитывать: память не может хранить бесконечную запись.
Число с плавающей точкой — представление числа в виде знака, мантиссы и порядка, при котором положение двоичной точки задаётся порядком. Например, запись ±m·2p позволяет отдельно хранить значащие цифры и масштаб. Так удобно кодировать как очень малые, так и очень большие значения.
Мантисса — значащая часть числа; в нормализованной двоичной записи она содержит ведущую единицу. Например, в записи 1,101₂ эта единица стоит перед точкой. Мантисса нужна, чтобы сохранить цифры, определяющие точное значение внутри выбранного масштаба.
Порядок — целое число, задающее степень основания системы счисления, на которую умножена мантисса. В двоичной системе порядок указывает степень двойки: например, умножение на 23 сдвигает точку вправо на три позиции. Он помогает задавать масштаб числа без хранения длинной последовательности нулей.
Если записывать все цифры числа подряд, для очень больших значений понадобятся длинные цепочки разрядов, а для очень малых — много нулей после точки. Это было бы неудобно: ячейка памяти имеет ограниченный размер и не могла бы одинаково эффективно хранить значения разных масштабов. Поэтому число представляют как ±m·2p: мантисса хранит значащую часть, а порядок задаёт масштаб. Так один и тот же формат может охватывать широкий диапазон чисел.
Одинаковое значение можно записать с разным положением двоичной точки, но тогда изменится и числовое значение мантиссы. Чтобы значение числа осталось прежним, при сдвиге точки в одну сторону порядок изменяют на противоположное количество позиций. Например, 1101,₂ = 1,101₂·23: точку в мантиссе сдвинули влево на три позиции и умножили её на 2³. Такая нормализация приводит запись к стандартному виду и делает представление более эффективным.
В форматах IEEE 754 ячейку делят на поля: бит знака, биты порядка и биты дробной части мантиссы. Знак отличает положительное число от отрицательного, а поле порядка позволяет задать масштаб. Для нормализованных чисел ведущая единица мантиссы подразумевается, поэтому явно хранят только дробную часть после неё. Это освобождает бит для представления дополнительных значащих цифр.
Сам порядок может быть положительным или отрицательным, но хранить его как обычное целое в поле фиксированного размера неудобно. Поэтому к нему прибавляют смещение: в одинарном формате 127, а в двойном 1023. Например, порядок −3 в одинарном формате кодируется значением 124, то есть −3 + 127. После чтения из памяти смещение вычитают, и получают исходный порядок.
Битов для мантиссы конечное число, поэтому многие дроби нельзя записать точно в двоичной системе. Например, десятичная дробь 0,1 имеет бесконечную периодическую двоичную запись, и её приходится обрезать до доступного количества разрядов. Сохранённое значение округляется до ближайшего представимого, а последующие операции работают уже с приближением. Поэтому небольшая погрешность возможна не только при записи, но и в результате вычислений.
| Свойство | Одинарная точность (32 бита) | Двойная точность (64 бита) |
|---|---|---|
| Число битов для знака | 1 | 1 |
| Число битов для порядка | 8 | 11 |
| Число битов для дробной части мантиссы | 23 | 52 |
| Число значащих двоичных разрядов с учётом скрытой ведущей единицы | 24 | 53 |
| Диапазон порядка и приблизительный диапазон представимых чисел | −126…127; примерно от 1,4·10−45 до 3,4·1038 | −1022…1023; примерно от 4,9·10−324 до 1,8·10308 |
| Точность представления и округления | Около 7 десятичных значащих цифр | Около 15–16 десятичных значащих цифр |
Числа в диапазоне порядка в таблице относятся к нормализованным значениям; в IEEE 754 есть также специальные представления, в том числе для очень малых поднормальных чисел. Таблица помогает выбрать формат, если важны диапазон значений или точность вычислений. Двойной формат обычно точнее, но занимает вдвое больше памяти.
Нужно отдельно перевести целую и дробную части, а затем соединить их. После этого запишем число в форме с плавающей точкой, чтобы определить мантиссу и порядок. Проверка обратным переводом покажет, что значение не изменилось.
Ответ: 13,25₁₀ = 1101,01₂ = 1,10101₂·2³. Проверка: 1,10101₂ = 1 + ½ + ⅛ + 1/32 = 1,65625, а 1,65625·8 = 13,25.
Всего в одинарном формате 32 бита. Нужно распределить их между знаком, порядком и дробной частью мантиссы согласно стандарту. Сумма размеров полей должна совпасть с общим размером ячейки.
Ответ: структура полей — 1 бит знака, 8 битов порядка и 23 бита дробной части мантиссы.
Десятичные числа в условии выглядят простыми, но компьютер выполняет сложение над их двоичными представлениями. Важно выяснить, можно ли точно сохранить каждое значение в конечном числе битов. Затем нужно учесть, что округление происходит и при хранении, и во время вычислений.
Ответ: результат может отличаться от 0,3 из-за округления приближённых двоичных значений. Обычно расхождение мало, но в длинной цепочке вычислений погрешности могут накапливаться.
Ошибочно считать, что число с плавающей точкой всегда хранится точно. Это кажется правдоподобным, если число имеет короткую десятичную запись, однако в двоичной системе оно может оказаться бесконечной дробью. Проверить себя можно переводом дробной части в двоичную систему: если она периодическая, конечное поле мантиссы не сохранит её точно.
Порядок часто путают с числом битов, отведённых под его поле. Путаница возникает из-за похожих слов, но порядок — показатель степени, а поле порядка — двоичный код этого показателя со смещением. Проверка простая: сначала выясните, какую степень двойки задаёт число, а затем отдельно смотрите, сколько битов выделено для её кодирования.
В поле мантиссы иногда записывают и ведущую единицу нормализованного числа. Её принимают за обязательный разряд записи, забывая, что стандарт подразумевает её для нормализованных значений. Сверьте количество разрядов: в одинарном формате явно хранится 23 бита дробной части, а точность равна 24 двоичным разрядам именно благодаря скрытой единице.
Ещё одна ошибка — игнорировать округление во время вычислений. Если результат отличается от ожидаемого, его могут объявить неверным, хотя расхождение объясняется накопленной погрешностью. Проверяйте величину разности и не полагайтесь на точное равенство вещественных значений, когда вычисления включали приближённые дроби.
Для работы с плавающей точкой нужны навыки перевода целых и дробных чисел между десятичной и двоичной системами: без них трудно понять мантиссу и оценить точность записи. Понимание степеней двойки и позиционной записи помогает разобраться, как порядок меняет масштаб числа. Округление связывает эту тему с оценкой погрешностей. Позже эти знания пригодятся при анализе точности вычислений, сравнении вещественных чисел и поиске ошибок в программах.
Почему вещественное число в компьютере часто хранится не точно?
В памяти есть только конечное число битов, а некоторые числа требуют бесконечной двоичной записи. Их представляют ближайшим доступным значением, поэтому возникает округление. Например, десятичная дробь 0,1 не имеет конечной записи в двоичной системе.
Что означают знак, мантисса и порядок?
Знак указывает, положительное число или отрицательное. Мантисса хранит его значащие цифры, а порядок задаёт степень основания системы счисления, на которую мантисса умножается. В двоичном формате основание равно двум.
Почему в нормализованной записи ведущая единица мантиссы не хранится?
У нормализованного ненулевого двоичного числа перед двоичной точкой всегда стоит единица. Формат IEEE 754 подразумевает эту единицу, поэтому не расходует на неё бит и использует освободившийся бит для точности. Это правило относится к нормализованным числам.
Чем одинарная точность отличается от двойной?
Одинарный формат занимает 32 бита, двойной — 64. В двойном формате больше битов отведено под порядок и дробную часть мантиссы, поэтому обычно доступны и более широкий диапазон, и более высокая точность. За это приходится платить большим расходом памяти.
Почему нельзя всегда сравнивать результаты вычислений с вещественными числами на точное равенство?
Округление может дать вместо ожидаемого значения соседнее число, отличающееся на очень малую величину. Поэтому два математически равных результата после вычислений могут иметь разные машинные записи. Часто проверяют, меньше ли разность значений заранее выбранной малой погрешности.
§ 29. Хранение в памяти вещественных чисел