Машинный эпсилон дает верхнюю границу относительной ошибки из-за округления в арифметике с плавающей запятой. Это значение характеризует компьютерную арифметику в области численного анализа и, в более широком смысле, в области вычислительной науки. Величина также называется мачепс или округление единиц и обозначается символами греческого эпсилон или полужирного римского u соответственно.
Следующие значения машинного эпсилон применяются к стандартным форматам с плавающей запятой:
IEEE 754 - 2008 г. | Распространенное имя | Тип данных C ++ | База | Точность | Машина эпсилон | Машина эпсилон |
---|---|---|---|---|---|---|
двоичный16 | половинная точность | N / A | 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,22e-16 |
повышенная точность, длинный двойной | _float80 | 2 | 64 | 2 −64 ≈ 5,42e-20 | 2 −63 ≈ 1.08e-19 | |
двоичный128 | четверная (ruple) точность | _float128 | 2 | 113 (один бит неявный) | 2 −113 ≈ 9,63e-35 | 2 −112 ≈ 1,93e-34 |
десятичный32 | десятичная дробь одинарной точности | _Decimal32 | 10 | 7 | 5 × 10 −7 | 10 −6 |
десятичный64 | десятичная дробь с двойной точностью | _Decimal64 | 10 | 16 | 5 × 10 −16 | 10 −15 |
десятичный128 | четверная (дробная) точность десятичная | _Decimal128 | 10 | 34 | 5 × 10 −34 | 10 −33 |
Округление - это процедура выбора представления действительного числа в системе счисления с плавающей запятой. Для системы счисления и процедуры округления машинный эпсилон - это максимальная относительная ошибка выбранной процедуры округления.
Необходима некоторая предыстория, чтобы определить значение из этого определения. Система счисления с плавающей запятой характеризуется основанием системы счисления, которое также называется основанием, и точностью, т. Е. Количеством разрядов системы счисления в мантиссе (включая любой начальный неявный бит). Все номера с одинаковым показателем, имеют интервал,. Интервал изменяется в числах, которые являются полной степенью ; расстояние на стороне большей величины в раз больше, чем расстояние на стороне меньшей величины.
Поскольку машинный эпсилон является границей относительной ошибки, достаточно рассматривать числа с показателем степени. Также достаточно рассматривать положительные числа. Для обычного типа округления от округления до ближайшего абсолютная ошибка округления составляет не более половины интервала, или. Это значение является наибольшим числителем относительной ошибки. Знаменатель в относительной погрешности является число округляется, которое должно быть как можно меньше, чтобы относительная погрешность велика. Поэтому наихудшая относительная ошибка возникает, когда округление применяется к числам в форме, где находится между и. Все эти числа округлены с относительной ошибкой. Максимум происходит, когда он находится на верхнем пределе своего диапазона. В знаменателе можно пренебречь по сравнению с числителем, поэтому его опускают для удобства и просто принимают за машинный эпсилон. Как было показано здесь, относительная ошибка является наихудшей для чисел, которые округляются до, поэтому машинный эпсилон также называется единичным округлением, что означает примерно «максимальную ошибку, которая может возникнуть при округлении до единичного значения».
Таким образом, максимальный интервал между нормализованным числом с плавающей запятой и соседним нормализованным числом составляет.
Численный анализ использует машинный эпсилон для изучения эффектов ошибки округления. Фактические ошибки машинной арифметики слишком сложны для непосредственного изучения, поэтому вместо этого используется следующая простая модель. В стандарте арифметики IEEE говорится, что все операции с плавающей запятой выполняются так, как если бы можно было выполнить операцию с бесконечной точностью, а затем результат округляется до числа с плавающей запятой. Предположим, что (1), являются числами с плавающей точкой, (2) является арифметической операции над числами с плавающей запятой, такие как сложение или умножение, и (3) является бесконечной операции точности. По стандарту компьютер рассчитывает:
По смыслу машинного эпсилон относительная ошибка округления не превышает машинного эпсилон по величине, поэтому:
где по абсолютной величине не больше или u. Можно обратиться к книгам Деммеля и Хайэма в справочных материалах, чтобы увидеть, как эта модель используется для анализа ошибок, например, исключения Гаусса.
Стандарт IEEE не определяет термины машинный эпсилон и единичное округление, поэтому используются разные определения этих терминов, что может вызвать некоторую путаницу.
Определение, данное здесь для машинного эпсилон, используется профессором Джеймсом Деммелем в сценариях лекций, в пакете линейной алгебры LAPACK, в исследовательских работах по числовым вычислениям и в некоторых программах для научных вычислений. Большинство численных аналитиков используют слова « машина-эпсилон» и « округление единицы измерения» как синонимы с этим значением.
Следующее другое определение гораздо более широко распространено за пределами академических кругов: Машинный эпсилон определяется как разница между 1 и следующим большим числом с плавающей запятой. Согласно этому определению, равняется значению единицы на последнем месте относительно 1, т. Е. И единица округления равна u, предполагая режим округления до ближайшего. Распространенность этого определения коренится в его использовании в стандарте ISO C для констант, относящихся к типам с плавающей запятой, и соответствующих констант в других языках программирования. Он также широко используется в программном обеспечении для научных вычислений, а также в числовой и компьютерной литературе.
Если стандартные библиотеки не обеспечивают предвычисленное значение (как lt; float.h gt; делают с FLT_EPSILON
, DBL_EPSILON
и LDBL_EPSILON
для C и lt; пределы gt; делает с в C ++), лучший способ определить машины Эпсилона обратиться к таблице, выше, и использовать соответствующая формула мощности. Эпсилон компьютерной машины часто приводится в качестве учебного упражнения. В следующих примерах машинный эпсилон вычисляется в смысле расстояния между числами с плавающей запятой в 1, а не в смысле единичного округления. std::numeric_limitslt;Tgt;::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; }
Это даст результат того же знака, что и значение. Если всегда желателен положительный результат, оператор return для machine_eps можно заменить на:
return (s.i64 lt; 0 ? value - s.d64: s.d64 - value);
64-битные числа с двойной точностью дают 2,220446e-16, что, как и ожидалось, равно 2 −52.
Следующий простой алгоритм может быть использован для аппроксимации машинного эпсилон с точностью до двух раз (один порядок величины ) от его истинного значения, используя линейный поиск.
epsilon = 1.0; while (1.0 + 0.5 * epsilon) ≠ 1.0: epsilon = 0.5 * epsilon