Машина эпсилон
Машинный эпсилон или машинная точность — это верхняя граница относительной ошибки аппроксимации из-за округления в системах счисления с плавающей запятой . Это значение характеризует компьютерную арифметику в области численного анализа и, в более широком смысле, в области вычислительной техники . Величина также называется мачепс и имеет символы греческого эпсилон. .
Существует два преобладающих определения, обозначенных здесь как эпсилон машины округления и эпсилон машины интервалов . Машинное эпсилон зависит от типа используемого округления и также называется единичным округлением , которое обозначается жирным римским символом u . Однако в общепринятом определении машинный эпсилон не зависит от метода округления и может быть эквивалентен u или 2 u .
Значения стандартной аппаратной арифметики
[ редактировать ]В следующей таблице перечислены машинные значения эпсилон для стандартных форматов с плавающей запятой.
ИЭЭЭ 754 – 2008. | Общее имя | Тип данных С++ | База | Точность | Округлительная машина эпсилон [а] | Интервальная машина эпсилон [б] |
---|---|---|---|---|---|---|
двоичный16 | половинная точность | Н/Д | 2 | 11 (один бит неявно) | 2 −11 ≈ 4.88e-04 | 2 −10 ≈ 9.77e-04 |
двоичный32 | одинарная точность | плавать | 2 | 24 (один бит неявно) | 2 −24 ≈ 5.96e-08 | 2 −23 ≈ 1.19e-07 |
двоичный64 | двойная точность | двойной | 2 | 53 (один бит неявно) | 2 −53 ≈ 1.11e-16 | 2 −52 ≈ 2,22е-16 |
расширенная точность , длинный двойной | _float80 [1] | 2 | 64 | 2 −64 ≈ 5,42е-20 | 2 −63 ≈ 1.08e-19 | |
двоичный128 | четверная (тройная) точность | _float128 [1] | 2 | 113 (один бит неявно) | 2 −113 ≈ 9,63е-35 | 2 −112 ≈ 1,93е-34 |
десятичное32 | десятичная дробь одинарной точности | _Decimal32 [2] | 10 | 7 | 5 × 10 −7 | 10 −6 |
десятичная дробь64 | десятичная дробь двойной точности | _Decimal64 [2] | 10 | 16 | 5 × 10 −16 | 10 −15 |
десятичное128 | десятичная точность четырехкратной (тройной) точности | _Decimal128 [2] | 10 | 34 | 5 × 10 −34 | 10 −33 |
- ^ Согласно формальному определению — используется профессором Деммелем, LAPACK и Scilab . Он представляет собой наибольшую относительную ошибку округления в режиме округления до ближайшего . Обоснование состоит в том, что ошибка округления составляет половину интервала вверх до следующего представимого числа с конечной точностью. Таким образом, относительная ошибка округления числа является . В этом контексте наибольшая относительная ошибка возникает, когда , и равен , поскольку действительные числа в нижней половине интервала 1,0 ~ 1,0+ULP(1) округляются до 1,0, а числа в верхней половине интервала округляются до 1,0+ULP(1). Здесь мы используем определение ULP(1) ( Единица на последнем месте ) как положительная разница между 1,0 (которое может быть представлено точно с конечной точностью) и следующим большим числом, представимым с конечной точностью.
- ^ Согласно общепринятому определению , используемому профессором Хайэмом; применяется в языковых константах в Ada , C , C++ , Fortran , MATLAB , Mathematica , Octave , Pascal , Python и Rust и т. д. и определяется в таких учебниках, как « Числовые рецепты » Press et al . Он представляет собой наибольший относительный интервал между двумя ближайшими числами при конечной точности или наибольшую ошибку округления в режиме округления за кусочком . Обоснование состоит в том, что относительный интервал числа является где - это расстояние до следующего представимого числа вверх с конечной точностью. В этом контексте наибольший относительный интервал возникает, когда , и представляет собой интервал между 1,0 (который может быть представлен точно с конечной точностью) и следующим большим представимым числом с плавающей запятой. Этот интервал равен ULP(1) .
Формальное определение ( Машина округления эпсилон)
[ редактировать ]Округление — это процедура выбора представления действительного числа в системе счисления с плавающей запятой . Для системы счисления и процедуры округления машинный эпсилон — это максимальная относительная ошибка выбранной процедуры округления.
Чтобы определить значение из этого определения, необходима некоторая предыстория. Система счисления с плавающей запятой характеризуется основанием , которое также называется основанием. , и по точности , т.е. число счисления цифры мантиссы ( включая любой ведущий неявный бит). Все числа с одинаковым показателем , , иметь интервал, . Расстояние меняется в числах, которые являются совершенными степенями ; расстояние на стороне большей величины равно раз больше расстояния на стороне меньшей величины.
Поскольку машинный эпсилон является границей относительной ошибки, достаточно рассматривать числа с показателем . Также достаточно рассмотреть положительные числа. Для обычного округления до ближайшего абсолютная ошибка округления составляет не более половины интервала или . Это значение является максимально возможным числителем относительной ошибки. Знаменателем . относительной ошибки является округляемое число, которое должно быть как можно меньшим, чтобы относительная ошибка была большой Поэтому наихудшая относительная ошибка возникает, когда округление применяется к числам вида где находится между и . Все эти числа округляются до с относительной ошибкой . Максимум имеет место, когда находится в верхней части своего диапазона. в знаменателе пренебрежимо мало по сравнению с числителем, поэтому для удобства его опустили, и просто принимается за машинный эпсилон. Как было показано здесь, относительная ошибка наибольшая для чисел, округляемых до , поэтому машинный эпсилон также называется единичным округлением, что примерно означает «максимальную ошибку, которая может возникнуть при округлении до единичного значения».
Таким образом, максимальное расстояние между нормализованными числами с плавающей запятой, , а соседнее нормализованное число равно . [3]
Арифметическая модель
[ редактировать ]Численный анализ использует машинный эпсилон для изучения последствий ошибки округления. Реальные ошибки машинной арифметики слишком сложны, чтобы их можно было изучать напрямую, поэтому вместо этого используется следующая простая модель. Стандарт арифметики IEEE гласит, что все операции с плавающей запятой выполняются так, как если бы можно было выполнить операцию с бесконечной точностью, а затем результат округляется до числа с плавающей запятой. Предположим (1) , являются числами с плавающей запятой, (2) — это арифметическая операция над числами с плавающей запятой, такая как сложение или умножение, и (3) это операция бесконечной точности. Согласно стандарту компьютер рассчитывает:
По смыслу машинного эпсилона относительная ошибка округления не превышает по величине машинного эпсилона, поэтому:
где по абсолютной величине не более или ты . Можно обратиться к книгам Деммеля и Хайэма, указанным в ссылках, чтобы увидеть, как эта модель используется для анализа ошибок, скажем, исключения Гаусса.
Основное определение ( эпсилон интервальной машины)
[ редактировать ]Стандарт IEEE не определяет термины «машинный эпсилон» и «единичное округление» , поэтому используются разные определения этих терминов, что может вызвать некоторую путаницу.
Формальное определение машинного эпсилона использовано профессором Джеймсом Деммелем в сценариях лекций: [4] пакет линейной алгебры LAPACK , [5] научные статьи по цифрам [6] и некоторое программное обеспечение для научных вычислений. [7] Большинство специалистов по численному анализу используют слова «машинный эпсилон» и «единичное округление» как синонимы этого значения.
Это альтернативное определение значительно более распространено: машинный эпсилон — это разница между 1 и следующим по величине числом с плавающей запятой .
Согласно этому определению, ε равно значению единицы, стоящей на последнем месте относительно 1, т.е. (где b — это основа системы с плавающей запятой, а p — точность), а единичное округление равно u = ε /2, предполагая режим округления до ближайшего , и u = ε , предполагая округление за кусочком .
Распространенность этого определения связана с его использованием в стандарте ISO C для констант, относящихся к типам с плавающей запятой. [8] [9] и соответствующие константы в других языках программирования. [10] [11] [12] Он также широко используется в программном обеспечении для научных вычислений. [13] [14] [15] и в числовой и вычислительной литературе. [16] [17] [18] [19]
Как определить машинный эпсилон
[ редактировать ]Там, где стандартные библиотеки не предоставляют предварительно вычисленные значения (как это делает < float.h > с FLT_EPSILON
, DBL_EPSILON
и LDBL_EPSILON
для C и < пределы > делает с std::numeric_limits<T>::epsilon()
в C++) лучший способ определить машинный эпсилон — обратиться к таблице выше и использовать соответствующую формулу степени. Эпсилон вычислительной машины часто используется в качестве упражнения из учебника. Следующие примеры вычисляют эпсилон интервальной машины в смысле интервала чисел с плавающей запятой в 1, а не в смысле округления единицы.
Обратите внимание, что результаты зависят от конкретного используемого формата с плавающей запятой, например float
, double
, long double
или аналогичный, поддерживаемый языком программирования, компилятором и библиотекой времени выполнения для конкретной платформы.
Некоторые форматы, поддерживаемые процессором, могут не поддерживаться выбранным компилятором и операционной системой. Библиотека времени выполнения может эмулировать другие форматы, включая арифметику произвольной точности, доступную в некоторых языках и библиотеках.
В строгом смысле термин «машинный эпсилон» означает точность поддерживается непосредственно процессором (или сопроцессором), а не каким-то точность поддерживается конкретным компилятором для конкретной операционной системы, если только не известно, что он использует лучший формат.
Форматы с плавающей запятой IEEE 754 обладают свойством, которое при переинтерпретации как целое число с дополнением до двух одинаковой ширины, они монотонно увеличиваются по положительным значениям и монотонно уменьшаются по отрицательным значениям (см. двоичное представление 32-битных чисел с плавающей запятой ). У них также есть свойство, , и (где это вышеупомянутая целочисленная интерпретация ). В языках, которые допускают каламбур типов и всегда используют IEEE 754–1985, мы можем использовать это для вычисления машинного эпсилона за постоянное время. Например, в С:
typedef union {
long long i64;
double d64;
} dbl_64;
double machine_eps (double value)
{
dbl_64 s;
s.d64 = value;
s.i64++;
return s.d64 - value;
}
Это даст результат того же знака, что и значение. Если всегда желателен положительный результат, оператор возврата Machine_eps можно заменить на:
return (s.i64 < 0 ? value - s.d64 : s.d64 - value);
Пример на Python:
def machineEpsilon(func=float):
machine_epsilon = func(1)
while func(1) + machine_epsilon != func(1):
machine_epsilon_last = machine_epsilon
machine_epsilon = func(machine_epsilon) / func(2)
return machine_epsilon_last
64-битные двойные значения дают 2.220446e-16, что равно 2 −52 как и ожидалось.
Приближение
[ редактировать ]Для аппроксимации можно использовать следующий простой алгоритм. [ нужны разъяснения ] машинный эпсилон с точностью до коэффициента два (один порядок ) от его истинного значения, используя линейный поиск .
epsilon = 1.0; while (1.0 + 0.5 * epsilon) ≠ 1.0: epsilon = 0.5 * epsilon
Машина эпсилон, также может быть просто рассчитано как двойка в отрицательной степени количества битов, используемых для мантиссы.
Связь с абсолютной относительной ошибкой
[ редактировать ]Если это машинное представление числа тогда абсолютная относительная ошибка представления равна [20]
Доказательство
[ редактировать ]Следующее доказательство ограничено положительными числами и машинными представлениями с использованием метода round-by-chop .
Если — положительное число, которое мы хотим представить, оно будет находиться между номером машины ниже и номер машины выше .
Если , где — количество битов, используемых для величины мантиссы , тогда:
Поскольку представление будет либо или ,
Хотя это доказательство ограничено положительными числами и последовательным дроблением, тот же метод можно использовать для доказательства неравенства в отношении отрицательных чисел и машинных представлений , округляемых до ближайших .
См. также
[ редактировать ]- Плавающая запятая , общее обсуждение проблем точности в арифметике с плавающей запятой.
- Юнит на последнем месте (ULP)
Примечания и ссылки
[ редактировать ]- ^ Jump up to: Перейти обратно: а б Плавающие типы — использование коллекции компиляторов GNU (GCC)
- ^ Jump up to: Перейти обратно: а б с Десятичное число с плавающей запятой — использование коллекции компиляторов GNU (GCC)
- ^ «Основные проблемы арифметики с плавающей запятой и анализа ошибок» . Калифорнийский университет, Беркли. 21 октября 1999 года . Проверено 11 июня 2022 г.
Расстояние между 1 и следующим большим числом с плавающей запятой составляет 2*мачепс.
- ^ «Основные проблемы арифметики с плавающей запятой и анализа ошибок» . 21 октября 1999 года . Проверено 11 апреля 2013 г.
- ^ «Руководство пользователя LAPACK, третье издание» . 22 августа 1999 года . Проверено 9 марта 2012 г.
- ^ «Дэвид Голдберг: Что должен знать каждый ученый-компьютерщик об арифметике с плавающей запятой, Обзоры вычислений ACM, том 23, № 1, март 1991 г.» (PDF) . Проверено 11 апреля 2013 г.
- ^ «Документация Scilab — Number_properties — определение параметров с плавающей запятой» . Проверено 11 апреля 2013 г.
- ^ Джонс, Дерек М. (2009). Новый стандарт C — экономический и культурный комментарий (PDF) . п. 377.
- ^ «Ссылка на float.h на cplusplus.com» . Проверено 11 апреля 2013 г.
- ^ «Ссылка на std::numeric_limits на cplusplus.com» . Проверено 11 апреля 2013 г.
- ^ «Документация Python — Системные параметры и функции» . Проверено 11 апреля 2013 г.
- ^ Расширенный Паскаль ISO 10206:1990 (Технический отчет).
Значение epsreal должно быть результатом вычитания 1,0 из наименьшего значения реального типа, превышающего 1,0.
- ^ «Документация Mathematica: $MachineEpsilon» . Проверено 11 апреля 2013 г.
- ^ «Документация Matlab — eps — Относительная точность чисел с плавающей запятой» . Архивировано из оригинала 7 августа 2013 г. Проверено 11 апреля 2013 г.
- ^ «Документация Octave — функция eps» . Проверено 11 апреля 2013 г.
- ^ Хайэм, Николас (2002). Точность и устойчивость численных алгоритмов (2-е изд.) . СИАМ. стр. 27–28.
- ^ Квартерони, Альфио ; Сакко, Риккардо; Салери, Фаусто (2000). Численная математика (PDF) . Спрингер. п. 49. ИСБН 0-387-98959-5 . Архивировано из оригинала (PDF) 14 ноября 2017 г. Проверено 11 апреля 2013 г.
- ^ Пресс, Уильям Х.; Теукольский, Саул А.; Веттерлинг, Уильям Т.; Фланнери, Брайан П. Численные рецепты . п. 890.
- ^ Энгельн-Мюлльгес, Гизела; Ройтер, Фриц (1996). Численные алгоритмы . п. 6. ISBN 3-18-401539-4 .
- ^ «Машинное значение Эпсилон для стандарта двойной точности IEEE, альтернативное доказательство с использованием относительной ошибки» . 12 октября 2020 г. Проверено 5 мая 2022 г.
- Андерсон, Э.; Руководство пользователя LAPACK, Общество промышленной и прикладной математики (SIAM), Филадельфия, Пенсильвания, третье издание, 1999 г.
- Коди, Уильям Дж.; MACHAR: программа для динамического определения параметров машины, Транзакции ACM в математическом программном обеспечении, Vol. 14(4), 1988, 303–311.
- Бессет, Дидье Х.; Объектно-ориентированная реализация численных методов, Морган и Кауфманн, Сан-Франциско, Калифорния, 2000.
- Деммель, Джеймс В. , Прикладная численная линейная алгебра, Общество промышленной и прикладной математики (SIAM), Филадельфия, Пенсильвания, 1997.
- Хайэм, Николас Дж.; Точность и стабильность числовых алгоритмов, Общество промышленной и прикладной математики (SIAM), Филадельфия, Пенсильвания, второе издание, 2002 г.
- Пресс, Уильям Х.; Теукольский, Саул А.; Веттерлинг, Уильям Т.; и Фланнери, Брайан П.; Численные рецепты на Фортране 77 , 2-е изд., гл. 20.2, стр. 881–886.
- Форсайт, Джордж Э.; Малькольм, Майкл А.; Молер, Клив Б.; «Компьютерные методы математических вычислений», Прентис-Холл, ISBN 0-13-165332-6 , 1977 г.
Внешние ссылки
[ редактировать ]- MACHAR , процедура (на C и Fortran) для «динамического вычисления машинных констант» (алгоритм ACM 722).
- Диагностика точности вычислений с плавающей запятой . Реализация MACHAR в Component Pascal и Oberon на основе версии MACHAR для Fortran 77, опубликованной в Numerical Recipes (Press et al., 1992).