Начнем с floor() и потолка() (который я буду называть здесь «ceil»). Это основные математические функции, которые отображают действительные числа в целые числа. Формально они определяются следующим образом:
floor(x) = max { n in Z | n <= x }
ceil(x) = min { n in Z | n >= x }
Более ясно, пол x
наибольшее целое, что не больше, чем x
, а CEIL наименьшее целое число, которое не меньше, чем x
. Некоторые примеры:
floor(1.5)
является 1
.
ceil(2)
является 2
.
floor(-3.14159)
является -4
.
Проконсультируйтесь с wikipedia для получения более подробной информации.
Хорошо, теперь давайте перейдем к округлению. Любое вещественное число x либо равно целое число (в этом случае floor(x) == x == ceil(x)
), либо находится между двумя целыми числами floor(x) < x < ceil(x)
. Математически «правило округления» представляет собой функцию f
, которая отображает действительные числа в целые числа со следующим свойством: для каждого действительного числа x
, f(x) = floor(x)
или f(x) = ceil(x)
. Это оставляет много гибкости в отношении того, какой возможный результат выбирается в любой ситуации, поэтому существует множество различных правил округления. Вот некоторые примеры (these certainly aren't exhaustive):
каждый из floor()
и ceil()
является правилом округления.
«круглый к нолю»: просто выбросьте дробную часть ввода. Это также называется усечением и часто записывается как математическая функция, называемая trunc()
. Его можно определить как trunc(x) = ceil(x)
, если x < 0
и trunc(x) = floor(x)
в противном случае *. Например, trunc(1.5)
- 1
и trunc(-2.7)
- -2
.
«округление от нуля» или «круглое к бесконечности»: это «противоположность» усечения; если x < 0
результат floor(x)
, а результат ceil(x)
в противном случае. Для этого правила нет общего математического имени, поэтому я просто назову его round-away()
. Примеры: round-away(1.001)
- 2
, а round-away(-0.7071067812)
- -1
.
«round to odd»: если вход x
является целым числом, верните x
. В противном случае просмотрите floor(x)
и ceil(x)
. Поскольку они являются целыми целыми числами, один из них будет четным, а другой будет нечетным. Верните ту, которая нечетна.Некоторые примеры: round-to-odd(1.001)
- 1
, round-to-odd(-2.001)
- -3
и round-to-odd(4.0)
- 4.0
.
«круглый до ближайшего, привязывается к четному»: это режим округления по умолчанию для IEEE-754. Я бы назвал это round()
, но это имя (довольно извращенно) используется для другого правила округления в библиотеке C, и я не хочу путать всех, поэтому я назову его rne()
, а не здесь. Здесь идея такова: если существует уникальное целое число, самое близкое к x
, верните это целое число. В противном случае x
находится ровно на полпути между двумя целыми числами; один из них четный, а другой - странный. Верните ровный.
Это последнее правило может быть записано как «RU с фиксированной вверх», хотя это несколько странный способ думать об этом, математически. Чаще всего, это формально определено более или менее следующим образом:
rne(x) = floor(x) if x - floor(x) < 0.5
floor(x) if x - floor(x) = 0.5 and floor(x) is even.
ceil(x) if x - floor(x) = 0.5 and floor(x) is odd.
ceil(x) if x - floor(x) > 0.5
Некоторые примеры этого rne()
правила в действии: rne(0.5)
является 0
. rne(-1.5)
есть -2
. rne(1.3)
- 1
. rne(1.8)
является 2
.
Хорошо, так что все это говорит о округление до целых значений. Что это связано с округлением до ближайшего числа с плавающей запятой, как в IEEE-754? Правило округления может использоваться не только для округления до целого числа, но и для округления до любого фиксированного числа цифр, просто масштабируя его в b**n
, где b
является базой представления, а n
выбрано так, что желаемая округленная точка номера заканчивается в позиции единиц (LSB). Конечно, на самом деле нам не нужно масштабировать число и не масштабировать результат; вместо этого мы просто заменяем ceil(x)
и floor(x)
в правиле округления с округленными значениями x
и до желаемого количества цифр.
[*] Я определяю математические функции здесь, не предоставляя реализации IEEE-754. Таким образом, нет необходимости иметь дело с краевыми случаями, такими как -0
, inf
, или nan
.
С вашего первого предложения указано, что вы пытаетесь узнать об округлении IEEE (предположительно IEEE 754, стандарте с плавающей запятой) из этой бумаги, следует отметить, что бумага не касается округления IEEE-754. Речь идет об осуществлении округления IEEE-754 с использованием функций в некоторых аппаратах компьютерной обработки. Во многом, речь идет не о математических свойствах IEEE 754, а о проектировании аппаратуры компьютерной обработки. Лучшее место для изучения IEEE-754 - это [страница Википедии] (http://en.wikipedia.org/wiki/IEEE_floating_point#CITEREFIEEE_7542008) ... –
или [официальный стандарт] (http://www.iso.org /iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469) (который имеет плату) или [* Справочник по арифметике с плавающей точкой * от Muller et al] (http://www.amazon.com/Handbook-Floating точечный-Арифметика-Жан-Мишель-Мюллер/дп/081764704X). –