WikiDer > Единица на последнем месте
Эта статья нужны дополнительные цитаты для проверка. (Март 2015 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
В Информатика и числовой анализ, единица на последнем месте или же единица наименьшей точности (ULP) - интервал между двумя последовательными плавающая точка числа, т. е. значение наименее значимого цифра (крайняя правая цифра) означает, что он равен 1. Он используется как мера точность в числовых расчетах.[1]
Определение
Одно определение: в основание б с точностью п, если бе ≤ |Икс| < бе+1, то ULP (Икс) = бМаксимум(е,емин)−п+1.[2]
Другое определение, предложенное Джоном Харрисоном, немного отличается: ULP (Икс) - расстояние между двумя ближайшими трансграничный числа с плавающей запятой а и б (т.е. те, у кого а ≤ Икс ≤ б и а ≠ б), предполагая, что диапазон экспоненты не ограничен сверху.[3][4] Эти определения различаются только степенью знаковой системы счисления.[2]
В IEEE 754 спецификация, за которой следует все современное оборудование с плавающей запятой, требует, чтобы результат элементарная арифметика операции (сложение, вычитание, умножение, деление и квадратный корень с 1985 года и FMA с 2008 года) быть правильно округленный, что означает, что при округлении до ближайшего, округленный результат находится в пределах 0,5 ULP от математически точного результата, используя определение Джона Харрисона; и наоборот, это свойство означает, что расстояние между округленным результатом и математически точным результатом минимизировано (но для промежуточных случаев это удовлетворяется двумя последовательными числами с плавающей запятой). Уважаемый числовой библиотеки вычислить основные трансцендентные функции от 0,5 до примерно 1 ULP. Лишь несколько библиотек вычисляют их в пределах 0,5 ULP, эта проблема сложна из-за Дилемма изготовителя стола.[5]
Примеры
Пример 1
Позволять Икс быть положительным числом с плавающей запятой и предположить, что активный атрибут округления округлить до ближайшего, привязать к четному, обозначается RN. Если ULP (Икс) меньше или равно 1, то RN (Икс + 1) > Икс. Иначе, RN (Икс + 1) = Икс или же RN (Икс + 1) = Икс + ULP (Икс), в зависимости от значения младшего разряда и показателя степени Икс. Это демонстрируется в следующем Haskell код, набранный в интерактивном запросе:[нужна цитата]
> до того как (\Икс -> Икс == Икс+1) (+1) 0 :: Плавать1.6777216e7> Это-11.6777215e7> Это+11.6777216e7
Здесь мы начинаем с 0 в одинарная точность и несколько раз прибавляйте 1, пока операция не изменит значение. Поскольку значимое для числа с одинарной точностью, содержащего 24 бита, первое целое число, которое нельзя точно представить, равно 224+1, и это значение округляется до 224 в круге до ближайшего, связи до четного. Таким образом, результат равен 224.
Пример 2
Следующий пример в Ява приблизительно π как значение с плавающей запятой, найдя два двойных значения в скобках π:
- п0 <π < п1
// π с 20 десятичными цифрамиBigDecimal π = новый BigDecimal("3.14159265358979323846");// усечение до двойного числа с плавающей запятойдвойной p0 = π.doubleValue();// -> 3.141592653589793 (шестнадцатеричное: 0x1.921fb54442d18p1)// p0 меньше π, поэтому найдите следующее число, представимое как doubleдвойной p1 = Математика.следующий(p0);// -> 3.1415926535897936 (шестнадцатеричное: 0x1.921fb54442d19p1)
потом ULP (π) определяется как
- ULP (π) = п1 - п0
// ulp (π) - разница между p1 и p0BigDecimal трепыхаться = новый BigDecimal(p1).вычесть(новый BigDecimal(p0));// -> 4.44089209850062616169452667236328125E-16// (это ровно 2 ** (- 51))// тот же результат при использовании стандартной библиотечной функциидвойной ulpMath = Математика.трепыхаться(p0);// -> 4.440892098500626E-16 (шестнадцатеричное: 0x1.0p-51)
Пример 3
Другой пример, в Python, также вводится в интерактивном приглашении:[нужна цитата]
>>> Икс = 1.0>>> п = 0>>> пока Икс != Икс + 1:... Икс = Икс * 2... п = п + 1... >>> Икс9007199254740992.0>>> п53>>> Икс + 2 + 19007199254740996.0
В этом случае мы начинаем с Икс = 1 и многократно удваивайте, пока Икс = Икс + 1. Как и в примере 1, результат равен 2.53 поскольку двойная точность Формат с плавающей запятой использует 53-битное значение.
Языковая поддержка
В Библиотеки Boost C ++ предоставляет функции boost :: math :: float_next
, boost :: math :: float_prior
, boost :: math :: nextafter
и boost :: math :: float_advance
для получения ближайших (и удаленных) значений с плавающей запятой,[6] и boost :: math :: float_distance (a, b)
для вычисления расстояния с плавающей запятой между двумя числами типа double.[7]
В Язык C Библиотека предоставляет функции для вычисления следующего числа с плавающей запятой в заданном направлении: nextafterf
и nexttowardf
за плавать
, следующий после
и рядом
за двойной
, nextafterl
и nexttowardl
за длинный двойной
, заявленный в <math.h>
. Он также предоставляет макросы FLT_EPSILON
, DBL_EPSILON
, LDBL_EPSILON
, которые представляют собой положительную разницу между 1,0 и следующим большим представимым числом в соответствующем типе (т. е. ULP на единицу).[8]
В Ява стандартная библиотека предоставляет функции Math.ulp (двойной)
и Math.ulp (с плавающей точкой)
. Они были представлены в Java 1.5.
В Быстрый стандартная библиотека обеспечивает доступ к следующему числу с плавающей запятой в некотором заданном направлении через свойства экземпляра nextDown
и следующий
. Он также предоставляет свойство экземпляра трепыхаться
и свойство типа ulpOfOne
(что соответствует макросам C вроде FLT_EPSILON
[9]) для типов Swift с плавающей запятой.[10]
Смотрите также
- IEEE 754
- ISO / IEC 10967, часть 1 требует функции ulp
- Наименее значащий бит (МЗБ)
- Машина эпсилон
Рекомендации
- ^ Дэвид Голдберг: Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой, раздел 1.2 Относительные ошибки и Ulps, ACM Computing Surveys, том 23, № 1, стр. 8, март 1991 г.
- ^ а б Мюллер, Жан-Мишель; Бруни, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Джолдес, Миоара; Лефевр, Винсент; Мелькионд, Гийом; Revol, Натали; Торрес, Серж (2018) [2010]. Справочник по арифметике с плавающей точкой (2-е изд.). Биркхойзер. Дои:10.1007/978-3-319-76526-6. ISBN 978-3-319-76525-9.
- ^ Харрисон, Джон. "Теория арифметики с плавающей точкой, проверенная машиной". Получено 17 июля 2013.
- ^ Мюллер, Жан-Мишель (2005-11). «Об определении ulp (x)». Технический отчет INRIA 5504. Транзакции ACM на математическом программном обеспечении, Vol. V, No. N, ноябрь 2005 г. Получено в 2012-03 гг. http://ljk.imag.fr/membres/Carine.Lucas/TPScilab/JMMuller/ulp-toms.pdf.
- ^ Кахан, Уильям. "Слишком умный логарифм". Получено 14 ноября 2008.
- ^ Увеличить float_advance.
- ^ Увеличить float_distance.
- ^ ISO / IEC 9899: 1999 спецификация (PDF). п. 237, §7.12.11.3 Функции nextafter и §7.12.11.4 Функции nexttoward.
- ^ "ulpOfOne - FloatingPoint | Документация для разработчиков Apple". Apple Inc.. Apple Inc.. Получено 18 августа 2019.
- ^ «FloatingPoint - Стандартная библиотека Swift | Документация для разработчиков Apple». Apple Inc.. Apple Inc.. Получено 18 августа 2019.
Библиография
Искать трепыхаться в Викисловаре, бесплатном словаре. |
- Голдберг, Дэвид (1991-03). «Ошибка округления» в статье «Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой». Computing Surveys, ACM, март 1991 г. Получено из http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#689.
- Мюллер, Жан-Мишель (2010). Справочник по арифметике с плавающей запятой. Бостон: Биркхойзер. С. 32–37. ISBN 978-0-8176-4704-9.