Re: Округление к ближайшему

From
Michael Ryazanov (2:5030/1006.64)
To
Max Alekseyev
Date
2002-10-13T20:51Z
Area
RU.ALGORITHMS
▐┤E╚°' Max!

08.10 14:42 Max Alekseyev, 2:5015/60 -> Vlad Golubev

 MA> Процитирую соответствующий параграф из "Аппроксиметрики" В.М.Юровицкого:
 MA> http://yur.ru/science/computer/appro/monografia.htm
 MA> ===cut===
 MA> 1.4.1. Округление приближенного числа

 MA> Важнейшей операцией в классической системе обработки приближенных чисел является
 MA> операция округления, т.е. переход от данного числа к некоему связанному с ним, но
 MA> менее точному, с меньшим числом значащих разрядов. Округление на один разряд
 MA> сводится к превращению последнего значащего разряда в незначащий (отбрасывание или
 MA> замена незначащим нулем). Если отбрасываемый разряд меньше 5, то больше ничего не
 MA> делается (округление с недостатком), а если отбрасываемый разряд превышает 5, то
 MA> предшествующий значащий разряд увеличивается на единицу (округление с избытком).
 MA> Если же округляемый разряд равен 5, то действует правило: четный предшествующий
 MA> разряд не изменяется, а нечетный увеличивается на единицу.

 MA> Если операцию округления обозначим через Q, то легко видеть, что Q(123'00)=12'000,
 MA> Q(0.3456')=0.346', Q(22.5')=22', Q(11.995')=12.00'.

 MA> Важным свойством округления в классической теории приближенных чисел является
 MA> равновероятность округления в любую сторону - как с избытком, так и с недостатком.

 MA> Казалось бы, мы имеем очень простую и естественную систему округления. Увы,
 MA> компьютерная техника так до сих пор и не смогла освоить этот алгоритм
 MA> округления.
 MA> ===cut===

   Автор либо писал это в незапамятном году, либо совершенно не знаком с вопросом. Вот цитата из документации к процессору i486:

15.2.3  Управление округлением

Во внутреннем  представлении модуль  обработки операций  с плавающей точкой
процессора  i486  использует  три  дополнительных  бита  (бит  защиты,  бит
округления и  бит подклейки),  которые применяются  для округления  чисел в
соответствии с  истинным результатом  бесконечной точности  вычислений. Эти
биты не доступны для программиста. Всегда, когда адресат может  представить
истинный  результат  бесконечной  точности,  модулю  обработки  операций  с
плавающей точкой не надо производить округление. Округление производится  в
арифметических операциях и операциях  сохранения, когда формат адресата  не
может  точно  представить  истинный  результат  с  бесконечной   точностью.
Например, вещественное число может  быть округлено, если оно  сохраняется в
более коротком вещественном формате  или в целочисленном формате.  Истинный
результат бесконечной точности  также может быть  округлен при занесении  в
регистр.
Модуль обработки операций с  плавающей точкой процессора i486  имеет четыре
режима  округления,  устанавливаемые  в  поле  управления  округлением (RC)
управляющего  слова   (смотрите  Рисунок   15-3).  По   данному   истинному
результату  b,  который  не  может  быть  представлен  нужным типом данных,
модуль обработки  операций с  плавающей точкой  определяет два представимых
числа a  и c,  которые наиболее  точно подходят  к значению  числа b с двух
сторон (a <  b < c).  Затем процессор округляет  (изменяет) b на  a или c в
соответствии с  режимом, установленном  в поле  округления, как  показано в
Таблице 15-5. Округление вносит в  результат ошибку, которая не больше  чем
единица в разряде, по которому велось округление.

 Таблица 15-5. Режимы Округления

┌───────────┬──────────────┬────────────────────────────────────┐
│Поле Управ-│    Режим     │                                    │
│ленеия Окру│  Округления  │      Действия при Округлении       │
│глением    │              │                                    │
├───────────┼──────────────┼────────────────────────────────────┤
│    00     │Округление до │ Определяем, к чему ближе b: к a или│
│           │ближайшего    │ c; если число равноудалено от этих │
│           │              │ чисел, то выбор четного числа (то, │
│           │              │ у которого наименьший значащий бит │
│           │              │ нулевой).                          │
├───────────┼──────────────┼────────────────────────────────────┤
│    01     │  Округление  │                                    │
│           │    снизу     │      a                             │
│           │   (до -x)    │                                    │
├───────────┼──────────────┼────────────────────────────────────┤
│    10     │  Округление  │                                    │
│           │    сверху    │      c                             │
│           │   (до +x)    │                                    │
├───────────┼──────────────┼────────────────────────────────────┤
│    11     │  Отсечение   │ Наименьшее из a или c              │
│           │   (до 0)     │                                    │
└───────────┴──────────────┴────────────────────────────────────┘

ОБРАТИТЕ ВНИМАНИЕ: a < b  < c; a и c  - успешно представимые числа; b  - не
представимо.
- "Округление до  ближайшего" - этот  режим устанавливается по  умолчанию и
применим  ко  многим  программным  продуктам;  он  предоставляет наибольшую
точность и статистически несмещенную оценку истинного результата.
-  Режим  "отсечения"  или  "округления  до  нуля" применим к целочисленным
арифметическим операциям.
-  "Округление  в  большую  сторону"  и  "округление  в  меньшую   сторону"
называются  ориентированным  округлением  и  могут  быть  использованы  для
реализации  интервальной  арифметики.  Интервальная арифметика используется
для  определения  верхней  и   нижней  границы  для  истинного   результата
многоступенчатых   расчетов   при   округлении   промежуточных  результатов
вычислений.
Управление округлением применимо только к арифметическим операциям  (список
арифметических и неарифметических команд приведен в Главе 16).


   И всё это является *стандартом*:

Возможности процессора i486 включают в себя:
<...>
- Встроенный модуль обработки арифметических операций с плавающей точкой для
поддержки  32,  64,  и  80-разрядных  форматов,  заданных в соответствие со
стандартом  IEEE  754  (объектно  совместимом  с  387  (TM)  DX  и  387  SX
арифметическими   сопроцессорами);

                                                                      |V|uxau/\
--- -- - ·
 * Origin:             Ф И З Ф А К - Ч Е М П И О H !           (2:5030/1006.64)