Машинный эпсилон или машинная точность — это верхняя граница относительной ошибки аппроксимации из-за округления в арифметике с плавающей запятой . Это значение характеризует компьютерную арифметику в области численного анализа и, в более широком смысле, в области вычислительной техники . Величина также называется мачепс и имеет символы греческого эпсилон .
Есть два преобладающих определения. В численном анализе машинное эпсилон зависит от типа используемого округления и также называется единичным округлением , которое обозначается жирным римским символом u . Однако, согласно менее формальному, но более широко используемому определению, машинный эпсилон не зависит от метода округления и может быть эквивалентен u или 2 u .
В следующей таблице перечислены машинные значения эпсилон для стандартных форматов с плавающей запятой. В каждом формате используется округление до ближайшего .
Округление — это процедура выбора представления действительного числа в системе счисления с плавающей запятой . Для системы счисления и процедуры округления машинный эпсилон — это максимальная относительная ошибка выбранной процедуры округления.
Чтобы определить значение из этого определения, необходима некоторая предыстория. Система счисления с плавающей запятой характеризуется системой счисления , которая также называется базой, и точностью , т.е. количеством цифр системы счисления мантиссы (включая любой ведущий неявный бит). Все числа с одинаковым показателем , имеют интервал . Расстояние меняется в числах, которые являются совершенными степенями ; расстояние на стороне большей величины в раз больше расстояния на стороне меньшей величины.
Поскольку машинный эпсилон является границей относительной ошибки, достаточно рассматривать числа с показателем степени . Также достаточно рассмотреть положительные числа. Для обычного округления до ближайшего абсолютная ошибка округления составляет не более половины интервала или . Это значение является максимально возможным числителем относительной ошибки. Знаменателем относительной ошибки является округляемое число, которое должно быть как можно меньшим, чтобы относительная ошибка была большой . Поэтому наихудшая относительная ошибка возникает, когда округление применяется к числам вида где находится между и . Все эти числа округляются до с относительной погрешностью . Максимум возникает, когда он находится в верхнем конце своего диапазона. В знаменателе пренебрежимо мало по сравнению с числителем, поэтому для удобства его оставляют и принимают просто за машинный эпсилон. Как было показано здесь, относительная ошибка наибольшая для чисел, которые округляются до , поэтому машинное эпсилон также называется единичным округлением , что примерно означает «максимальную ошибку, которая может возникнуть при округлении до единичного значения».
Таким образом, максимальное расстояние между нормализованным числом с плавающей запятой и соседним нормализованным числом равно . [3]
Численный анализ использует машинный эпсилон для изучения последствий ошибки округления. Реальные ошибки машинной арифметики слишком сложны, чтобы их можно было изучать напрямую, поэтому вместо этого используется следующая простая модель. Стандарт арифметики IEEE гласит, что все операции с плавающей запятой выполняются так, как если бы можно было выполнить операцию с бесконечной точностью, а затем результат округляется до числа с плавающей запятой. Предположим, (1) — числа с плавающей запятой, (2) — арифметическая операция над числами с плавающей запятой, такая как сложение или умножение, и (3) — операция бесконечной точности. Согласно стандарту компьютер рассчитывает:
По смыслу машинного эпсилона относительная ошибка округления не превышает по величине машинного эпсилона, поэтому:
где по абсолютной величине не более или u . Можно обратиться к книгам Деммеля и Хайэма, указанным в ссылках, чтобы увидеть, как эта модель используется для анализа ошибок, скажем, исключения Гаусса.
Стандарт IEEE не определяет термины « машинный эпсилон » и «единичное округление» , поэтому используются разные определения этих терминов, что может вызвать некоторую путаницу.
Формальное определение машинного эпсилона использовано профессором Джеймсом Деммелем в сценариях лекций, [4] в пакете линейной алгебры LAPACK , [5] в исследовательских работах по числовым вычислениям [6] и в некоторых программах для научных вычислений. [7] Большинство специалистов по численному анализу используют слова « машинный эпсилон» и «единичное округление» как синонимы этого значения.
Это альтернативное определение гораздо более распространено за пределами академических кругов: машинный эпсилон — это разница между 1 и следующим по величине числом с плавающей запятой .
Согласно этому определению, равно значению единицы в последнем месте относительно 1, т. е. (где — основа системы с плавающей запятой и — точность), а округление единицы равно u , предполагая режим округления до ближайшего , и u , предполагая , что по кусочкам .
Распространенность этого определения коренится в его использовании в стандарте ISO C для констант, относящихся к типам с плавающей запятой [8] [9] и соответствующих констант в других языках программирования. [10] [11] [12] Он также широко используется в программном обеспечении для научных вычислений, [13] [14] [15] , а также в числовой и вычислительной литературе. [16] [17] [18] [19]
Там, где стандартные библиотеки не предоставляют заранее вычисленные значения (как < float.h > делает с FLT_EPSILON
, DBL_EPSILON
а LDBL_EPSILON
для C и < limits > делает с в C++), лучший способ определить машинный эпсилон — обратиться к таблице выше и использовать соответствующая формула мощности. Эпсилон вычислительной машины часто преподается в качестве упражнения из учебника. В следующих примерах машинный эпсилон вычисляется в смысле интервала между числами с плавающей запятой в 1, а не в смысле округления единицы.std::numeric_limits<T>::epsilon()
Обратите внимание, что результаты зависят от конкретного используемого формата с плавающей запятой, например float
, double
, long double
, или аналогичного, поддерживаемого языком программирования, компилятором и библиотекой времени выполнения для реальной платформы.
Некоторые форматы, поддерживаемые процессором, могут не поддерживаться выбранным компилятором и операционной системой. Библиотека времени выполнения может эмулировать другие форматы, включая арифметику произвольной точности, доступную в некоторых языках и библиотеках.
В строгом смысле термин « машинный эпсилон» означает точность, непосредственно поддерживаемую процессором (или сопроцессором), а не некоторую точность, поддерживаемую конкретным компилятором для конкретной операционной системы, если только не известно, что он использует лучший формат.
Форматы с плавающей запятой IEEE 754 обладают свойством, которое при переинтерпретации как целое число с дополнением до двух одинаковой ширины, они монотонно увеличиваются по положительным значениям и монотонно уменьшаются по отрицательным значениям (см. двоичное представление 32-битных чисел с плавающей запятой ). У них также есть свойство , и (где находится вышеупомянутая целочисленная интерпретация ). В языках, которые допускают каламбур типов и всегда используют IEEE 754–1985, мы можем использовать это для вычисления машинного эпсилона за постоянное время. Например, в С:
typedef Union { long long i64 ; двойной д64 ; } dbl_64 ; двойной Machine_eps ( двойное значение ) { dbl_64 s ; с . d64 = значение ; с . я64 ++ ; вернуть с . d64 – значение ; }
Это даст результат того же знака, что и значение. Если всегда желателен положительный результат, оператор возврата Machine_eps можно заменить на:
return ( s . i64 < 0 ? значение - s . d64 : s . d64 - значение );
Пример на 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 .
Следующий простой алгоритм можно использовать для аппроксимации [ необходимы пояснения ] машинного эпсилона с точностью до коэффициента два (один порядок величины ) от его истинного значения, используя линейный поиск .
эпсилон = 1,0;при этом (1,0 + 0,5 * эпсилон) ≠ 1,0: эпсилон = 0,5 * эпсилон
Машинный эпсилон также можно просто вычислить как двойку в отрицательной степени количества битов, используемых для мантиссы.
Если это машинное представление числа , то абсолютная относительная ошибка представления равна [20]
Следующее доказательство ограничено положительными числами и машинными представлениями с использованием метода round-by-chop .
Если это положительное число, которое мы хотим представить, оно будет находиться между номером машины ниже и номером машины выше .
Если , где – количество битов, используемых для величины мантиссы , то:
Поскольку представление будет либо или ,
Хотя это доказательство ограничено положительными числами и последовательным дроблением, тот же метод можно использовать для доказательства неравенства в отношении отрицательных чисел и машинных представлений, округляемых до ближайших .
Расстояние между 1 и следующим большим числом с плавающей запятой составляет 2*мачепс.
Значение
epsreal
должно быть результатом вычитания 1,0 из наименьшего значения реального типа, превышающего 1,0.