2013-11-14 4 views
3

Я пытаюсь узнать особенности IEEE округление из следующего источника On fast IEEE Roundingсхемы IEEE Округление

enter image description here Может кто-нибудь объяснить уравнение сгонять? Что означает округление с фиксацией? А какие функции пола и потолка? Я пробовал IEEE 754, но не упоминает об этом

+0

С вашего первого предложения указано, что вы пытаетесь узнать об округлении IEEE (предположительно IEEE 754, стандарте с плавающей запятой) из этой бумаги, следует отметить, что бумага не касается округления IEEE-754. Речь идет об осуществлении округления IEEE-754 с использованием функций в некоторых аппаратах компьютерной обработки. Во многом, речь идет не о математических свойствах IEEE 754, а о проектировании аппаратуры компьютерной обработки. Лучшее место для изучения IEEE-754 - это [страница Википедии] (http://en.wikipedia.org/wiki/IEEE_floating_point#CITEREFIEEE_7542008) ... –

+0

или [официальный стандарт] (http://www.iso.org /iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469) (который имеет плату) или [* Справочник по арифметике с плавающей точкой * от Muller et al] (http://www.amazon.com/Handbook-Floating точечный-Арифметика-Жан-Мишель-Мюллер/дп/081764704X). –

ответ

4

Начнем с 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.