Машинный эпсилон или машинная точность — это верхняя граница относительной погрешности аппроксимации из-за округления в системах с плавающей точкой . Это значение характеризует компьютерную арифметику в области численного анализа и, в более широком смысле, в предмете вычислительной науки . Величина также называется мачепс и имеет греческие символы эпсилон .
Существует два преобладающих определения, обозначенные здесь как округляющая машина эпсилон или формальное определение и интервальная машина эпсилон или общепринятое определение.
В общепринятом определении машинный эпсилон не зависит от метода округления и определяется просто как разность между 1 и следующим большим числом с плавающей запятой .
В формальном определении машинный эпсилон зависит от типа используемого округления и также называется округлением единиц , которое обозначается жирным римским символом u .
В целом можно считать, что эти два термина различаются всего лишь в два раза, при этом формальное определение дает эпсилон в два раза меньше общепринятого определения , как показано в таблицах в следующем разделе.
В следующей таблице перечислены значения машинного эпсилон для стандартных форматов с плавающей точкой.
Стандарт IEEE не определяет термины «машинный эпсилон» и «округление единиц» , поэтому используются разные определения этих терминов, что может вызвать некоторую путаницу.
Эти два термина отличаются всего на два фактора. Более широко используемый термин (называемый в этой статье общепринятым определением ) используется в большинстве современных языков программирования и определяется просто как машинный эпсилон — это разница между 1 и следующим большим числом с плавающей точкой . Формальное определение, как правило, можно считать дающим эпсилон в два раза меньше общепринятого определения , хотя его определение меняется в зависимости от используемой формы округления.
Эти два термина подробно описаны в следующих двух подразделах.
Формальное определение машинного эпсилона использовалось профессором Джеймсом Деммелем в лекционных записях, [3] пакете линейной алгебры LAPACK , [4] числовых исследовательских работах [5] и некотором программном обеспечении для научных вычислений. [6] Большинство специалистов по численному анализу используют слова машинный эпсилон и округление единиц взаимозаменяемо в этом значении, которое подробно рассматривается в этом подразделе.
Округление — это процедура выбора представления действительного числа в системе счисления с плавающей точкой . Для системы счисления и процедуры округления машинный эпсилон — это максимальная относительная погрешность выбранной процедуры округления.
Для определения значения из этого определения необходимы некоторые сведения. Система счисления с плавающей точкой характеризуется основанием , которое также называется основанием, , и точностью , т. е. числом цифр основания мантиссы ( включая любой ведущий неявный бит). Все числа с одинаковой экспонентой , , имеют интервал, . Интервал изменяется в числах, которые являются совершенными степенями ; интервал со стороны большей величины в раз больше интервала со стороны меньшей величины.
Поскольку машинный эпсилон является границей относительной погрешности, достаточно рассмотреть числа с показателем . Также достаточно рассмотреть положительные числа. Для обычного округления до ближайшего абсолютная погрешность округления составляет не более половины интервала, или . Это значение является наибольшим возможным числителем относительной погрешности. Знаменатель в относительной погрешности — это округляемое число, которое должно быть как можно меньше, чтобы относительная погрешность была большой. Таким образом, наибольшая относительная погрешность возникает, когда округление применяется к числам вида , где находится между и . Все эти числа округляются до с относительной погрешностью . Максимум возникает, когда находится в верхнем конце своего диапазона. В знаменателе пренебрежимо мало по сравнению с числителем, поэтому он опущен для целесообразности и просто принимается как машинный эпсилон. Как было показано здесь, относительная погрешность наибольшая для чисел, которые округляются до , поэтому машинный эпсилон также называется округлением до единицы, что примерно означает «максимальная ошибка, которая может возникнуть при округлении до значения единицы».
Таким образом, максимальный интервал между нормализованным числом с плавающей точкой, , и соседним нормализованным числом составляет . [7]
Численный анализ использует машинный эпсилон для изучения эффектов ошибки округления. Фактические ошибки машинной арифметики слишком сложны для непосредственного изучения, поэтому вместо этого используется следующая простая модель. Арифметический стандарт IEEE гласит, что все операции с плавающей точкой выполняются так, как если бы можно было выполнить операцию с бесконечной точностью, а затем результат округляется до числа с плавающей точкой. Предположим, что (1) , являются числами с плавающей точкой, (2) является арифметической операцией над числами с плавающей точкой, такой как сложение или умножение, и (3) является операцией с бесконечной точностью. Согласно стандарту, компьютер вычисляет:
По значению машинного эпсилона относительная погрешность округления по величине не превышает машинного эпсилона, поэтому:
где по абсолютной величине не более или u . В книгах Деммеля и Хайэма в ссылках можно ознакомиться, чтобы увидеть, как эта модель используется для анализа ошибок, скажем, метода исключения Гаусса.
Это альтернативное определение гораздо более распространено: машинный эпсилон — это разница между 1 и следующим большим числом с плавающей точкой . Это определение используется в языковых константах в Ada , C , C++ , Fortran , MATLAB , Mathematica , Octave , Pascal , Python и Rust и т. д., а также определено в учебниках, таких как « Numerical Recipes » Пресса и др .
Согласно этому определению, ε равно значению единицы , стоящей на последнем месте относительно 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 и < limits > с в C++), лучшим способом определения машинного эпсилона является обращение к таблице выше и использование соответствующей формулы степени. Вычисление машинного эпсилона часто приводится в качестве упражнения в учебнике. В следующих примерах вычисляется интервальный машинный эпсилон в смысле интервала между числами с плавающей точкой на 1, а не в смысле округления единицы.std::numeric_limits<T>::epsilon()
Обратите внимание, что результаты зависят от конкретного используемого формата с плавающей точкой, например float
, double
, long double
, или аналогичного, поддерживаемого языком программирования, компилятором и библиотекой времени выполнения для фактической платформы.
Некоторые форматы, поддерживаемые процессором, могут не поддерживаться выбранным компилятором и операционной системой. Другие форматы могут эмулироваться библиотекой времени выполнения, включая арифметику произвольной точности, доступную в некоторых языках и библиотеках.
В строгом смысле термин « машинный эпсилон» означает точность, напрямую поддерживаемую процессором (или сопроцессором), а не некоторую точность, поддерживаемую конкретным компилятором для конкретной операционной системы, если только не известно, что он использует наилучший формат.
Форматы с плавающей точкой IEEE 754 обладают тем свойством, что при переинтерпретации в виде целого числа с дополнением до двух той же ширины они монотонно увеличиваются при положительных значениях и монотонно уменьшаются при отрицательных значениях (см. двоичное представление 32-битных чисел с плавающей точкой ). Они также обладают тем свойством, что , и (где — вышеупомянутая целочисленная переинтерпретация ). В языках, которые допускают каламбуры и всегда используют IEEE 754–1985, мы можем использовать это для вычисления машинного эпсилона за постоянное время. Например, в C:
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 можно заменить на:
возврат ( 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*macheps.
Значение
epsreal
должно быть результатом вычитания 1,0 из наименьшего значения типа real, которое больше 1,0.