Как найти машинное эпсилон

From Wikipedia, the free encyclopedia

Machine epsilon or machine precision is an upper bound on the relative approximation error due to rounding in floating point arithmetic. This value characterizes computer arithmetic in the field of numerical analysis, and by extension in the subject of computational science. The quantity is also called macheps and it has the symbols Greek epsilon varepsilon .

There are two prevailing definitions. In numerical analysis, machine epsilon is dependent on the type of rounding used and is also called unit roundoff, which has the symbol bold Roman u. However, by a less formal, but more widely-used definition, machine epsilon is independent of rounding method and may be equivalent to u or 2u.

Values for standard hardware arithmetics[edit]

The following table lists machine epsilon values for standard floating-point formats. Each format uses round-to-nearest.

IEEE 754 — 2008 Common name C++ data type Base b Precision p Machine epsilon[a] b^{-(p-1)}/2 Machine epsilon[b] b^{-(p-1)}
binary16 half precision N/A 2 11 (one bit is implicit) 2−11 ≈ 4.88e-04 2−10 ≈ 9.77e-04
binary32 single precision float 2 24 (one bit is implicit) 2−24 ≈ 5.96e-08 2−23 ≈ 1.19e-07
binary64 double precision double 2 53 (one bit is implicit) 2−53 ≈ 1.11e-16 2−52 ≈ 2.22e-16
extended precision, long double _float80[1] 2 64 2−64 ≈ 5.42e-20 2−63 ≈ 1.08e-19
binary128 quad(ruple) precision _float128[1] 2 113 (one bit is implicit) 2−113 ≈ 9.63e-35 2−112 ≈ 1.93e-34
decimal32 single precision decimal _Decimal32[2] 10 7 5 × 10−7 10−6
decimal64 double precision decimal _Decimal64[2] 10 16 5 × 10−16 10−15
decimal128 quad(ruple) precision decimal _Decimal128[2] 10 34 5 × 10−34 10−33
  1. ^ According to formal definition—used by Prof. Demmel, LAPACK and Scilab
  2. ^ According to widespread variant definition—used by per Prof. Higham; ISO C standard; Ada, C, C++ and Python language constants; Mathematica, MATLAB and Octave; and various textbooks

Formal definition[edit]

Rounding is a procedure for choosing the representation of a real number in a floating point number system. For a number system and a rounding procedure, machine epsilon is the maximum relative error of the chosen rounding procedure.

Some background is needed to determine a value from this definition. A floating point number system is characterized by a radix which is also called the base, b, and by the precision p, i.e. the number of radix b digits of the significand (including any leading implicit bit). All the numbers with the same exponent, e, have the spacing, b^{e-(p-1)}. The spacing changes at the numbers that are perfect powers of b; the spacing on the side of larger magnitude is b times larger than the spacing on the side of smaller magnitude.

Since machine epsilon is a bound for relative error, it suffices to consider numbers with exponent e=0. It also suffices to consider positive numbers. For the usual round-to-nearest kind of rounding, the absolute rounding error is at most half the spacing, or b^{-(p-1)}/2. This value is the biggest possible numerator for the relative error. The denominator in the relative error is the number being rounded, which should be as small as possible to make the relative error large. The worst relative error therefore happens when rounding is applied to numbers of the form 1+a where a is between {displaystyle 0} and b^{-(p-1)}/2. All these numbers round to 1 with relative error a/(1+a). The maximum occurs when a is at the upper end of its range. The 1+a in the denominator is negligible compared to the numerator, so it is left off for expediency, and just b^{-(p-1)}/2 is taken as machine epsilon. As has been shown here, the relative error is worst for numbers that round to 1, so machine epsilon also is called unit roundoff meaning roughly «the maximum error that can occur when rounding to the unit value».

Thus, the maximum spacing between a normalised floating point number, x, and an adjacent normalised number is {displaystyle 2varepsilon |x|}.[3]

Arithmetic model[edit]

Numerical analysis uses machine epsilon to study the effects of rounding error. The actual errors of machine arithmetic are far too complicated to be studied directly, so instead, the following simple model is used. The IEEE arithmetic standard says all floating-point operations are done as if it were possible to perform the infinite-precision operation, and then, the result is rounded to a floating-point number. Suppose (1) x, y are floating-point numbers, (2) bullet is an arithmetic operation on floating-point numbers such as addition or multiplication, and (3) circ is the infinite precision operation. According to the standard, the computer calculates:

x bullet y = mbox {round} (x circ y)

By the meaning of machine epsilon, the relative error of the rounding is at most machine epsilon in magnitude, so:

x bullet y = (x circ y)(1 + z)

where z in absolute magnitude is at most varepsilon or u. The books by Demmel and Higham in the references can be consulted to see how this model is used to analyze the errors of, say, Gaussian elimination.

Variant definitions[edit]

The IEEE standard does not define the terms machine epsilon and unit roundoff, so differing definitions of these terms are in use, which can cause some confusion.

The formal definition for machine epsilon is the one used by Prof. James Demmel in lecture scripts,[4] the LAPACK linear algebra package,[5] numerics research papers[6] and some scientific computing software.[7] Most numerical analysts use the words machine epsilon and unit roundoff interchangeably with this meaning.

This alternative definition is much more widespread outside academia: machine epsilon is the difference between 1 and the next larger floating point number.

By this definition, varepsilon equals the value of the unit in the last place relative to 1, i.e. b^{-(p-1)} (where b is the base of the floating point system and p is the precision) and the unit roundoff is u{displaystyle ,=varepsilon /2}, assuming round-to-nearest mode, and u{displaystyle ,=varepsilon }, assuming round-by-chop.

The prevalence of this definition is rooted in its use in the ISO C Standard for constants relating to floating-point types[8][9] and corresponding constants in other programming languages.[10][11][12] It is also widely used in scientific computing software,[13][14][15] and in the numerics and computing literature.[16][17][18][19]

How to determine machine epsilon[edit]

Where standard libraries do not provide precomputed values (as <float.h> does with FLT_EPSILON, DBL_EPSILON and LDBL_EPSILON for C and <limits> does with std::numeric_limits<T>::epsilon() in C++), the best way to determine machine epsilon is to refer to the table, above, and use the appropriate power formula. Computing machine epsilon is often given as a textbook exercise. The following examples compute machine epsilon in the sense of the spacing of the floating point numbers at 1 rather than in the sense of the unit roundoff.

Note that results depend on the particular floating-point format used, such as float, double, long double, or similar as supported by the programming language, the compiler, and the runtime library for the actual platform.

Some formats supported by the processor might not be supported by the chosen compiler and operating system. Other formats might be emulated by the runtime library, including arbitrary-precision arithmetic available in some languages and libraries.

In a strict sense the term machine epsilon means the 1+varepsilon accuracy directly supported by the processor (or coprocessor), not some 1+varepsilon accuracy supported by a specific compiler for a specific operating system, unless it’s known to use the best format.

IEEE 754 floating-point formats have the property that, when reinterpreted as a two’s complement integer of the same width, they monotonically increase over positive values and monotonically decrease over negative values (see the binary representation of 32 bit floats). They also have the property that {displaystyle 0<|f(x)|<infty }, and {displaystyle |f(x+1)-f(x)|geq |f(x)-f(x-1)|} (where f(x) is the aforementioned integer reinterpretation of x). In languages that allow type punning and always use IEEE 754-1985, we can exploit this to compute a machine epsilon in constant time. For example, in 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;
}

Example in 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

This will give a result of the same sign as value. If a positive result is always desired, the return statement of machine_eps can be replaced with:

    return (s.i64 < 0 ? value - s.d64 : s.d64 - value);

64-bit doubles give 2.220446e-16, which is 2−52 as expected.

Approximation[edit]

The following simple algorithm can be used to approximate[clarification needed] the machine epsilon, to within a factor of two (one order of magnitude) of its true value, using a linear search.

epsilon = 1.0;

while (1.0 + 0.5 * epsilon) ≠ 1.0:
    epsilon = 0.5 * epsilon

The machine epsilon, {textstyle varepsilon _{text{mach}}} can also simply be calculated as two to the negative power of the number of bits used for the mantissa.

{displaystyle varepsilon _{text{mach}} = 2^{-{text{bits used for magnitude of mantissa}}}}

Relationship to absolute relative error[edit]

If {textstyle y} is the machine representation of a number {textstyle x} then the absolute relative error in the representation is {textstyle left|{dfrac {x-y}{x}}right|leq varepsilon _{text{mach}}.}[20]

Proof[edit]

The following proof is limited to positive numbers and machine representations using round-by-chop.

If {textstyle x} is a positive number we want to represent, it will be between a machine number {textstyle x_{b}} below {textstyle x} and a machine number {textstyle x_{u}} above {textstyle x}.

If {textstyle x_{b}=left(1.b_{1}b_{2}ldots b_{m}right)_{2}times 2^{k}}, where {textstyle m} is the number of bits used for the magnitude of the significand, then:

{displaystyle {begin{aligned}x_{u}&=left[(1.b_{1}b_{2}ldots b_{m})_{2}+(0.00ldots 1)_{2}right]times 2^{k}\&=left[(1.b_{1}b_{2}ldots b_{m})_{2}+2^{-m}right]times 2^{k}\&=(1.b_{1}b_{2}ldots b_{m})_{2}times 2^{k}+2^{-m}times 2^{k}\&=(1.b_{1}b_{2}ldots b_{m})_{2}times 2^{k}+2^{-m+k}.end{aligned}}}

Since the representation of {textstyle x} will be either {textstyle x_{b}} or {textstyle x_{u}},

{displaystyle {begin{aligned}left|x-yright|&leq left|x_{b}-x_{u}right|\&=2^{-m+k}end{aligned}}}

{displaystyle {begin{aligned}left|{frac {x-y}{x}}right|&leq {frac {2^{-m+k}}{x}}\&leq {frac {2^{-m+k}}{x_{b}}}\&={frac {2^{-m+k}}{(1cdot b_{1}b_{2}ldots b_{m})_{2}2^{k}}}\&={frac {2^{-m}}{(1cdot b_{1}b_{2}ldots b_{m})_{2}}}\&leq 2^{-m}=varepsilon _{text{mach}}.end{aligned}}}

Although this proof is limited to positive numbers and round-by-chop, the same method can be used to prove the inequality in relation to negative numbers and round-to-nearest machine representations.

See also[edit]

  • Floating point, general discussion of accuracy issues in floating point arithmetic
  • Unit in the last place (ULP)

Notes and references[edit]

  1. ^ a b Floating Types — Using the GNU Compiler Collection (GCC)
  2. ^ a b c Decimal Float — Using the GNU Compiler Collection (GCC)
  3. ^ «Basic Issues in Floating Point Arithmetic and Error Analysis». University of California, Berkeley. 21 October 1999. Retrieved 11 June 2022. The distance between 1 and the next larger floating point number is 2*macheps.
  4. ^ «Basic Issues in Floating Point Arithmetic and Error Analysis». 21 Oct 1999. Retrieved 11 Apr 2013.
  5. ^ «LAPACK Users’ Guide Third Edition». 22 August 1999. Retrieved 9 March 2012.
  6. ^ «David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic, ACM Computing Surveys, Vol 23, No 1, March 1991» (PDF). Retrieved 11 Apr 2013.
  7. ^ «Scilab documentation — number_properties — determine floating-point parameters». Retrieved 11 Apr 2013.
  8. ^ Jones, Derek M. (2009). The New C Standard — An Economic and Cultural Commentary (PDF). p. 377.
  9. ^ «float.h reference at cplusplus.com». Retrieved 11 Apr 2013.
  10. ^ «std::numeric_limits reference at cplusplus.com». Retrieved 11 Apr 2013.
  11. ^ «Python documentation — System-specific parameters and functions». Retrieved 11 Apr 2013.
  12. ^ Extended Pascal ISO 10206:1990 (Technical report). The value of epsreal shall be the result of subtracting 1.0 from the smallest value of real-type that is greater than 1.0.
  13. ^ «Mathematica documentation: $MachineEpsilon». Retrieved 11 Apr 2013.
  14. ^ «Matlab documentation — eps — Floating-point relative accuracy». Archived from the original on 2013-08-07. Retrieved 11 Apr 2013.
  15. ^ «Octave documentation — eps function». Retrieved 11 Apr 2013.
  16. ^ Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. pp. 27–28.
  17. ^ Quarteroni, Alfio; Sacco, Riccardo; Saleri, Fausto (2000). Numerical Mathematics (PDF). Springer. p. 49. ISBN 0-387-98959-5. Archived from the original (PDF) on 2017-11-14. Retrieved 2013-04-11.
  18. ^ Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; Flannery, Brian P. Numerical Recipes. p. 890.
  19. ^ Engeln-Müllges, Gisela; Reutter, Fritz (1996). Numerik-Algorithmen. p. 6. ISBN 3-18-401539-4.
  20. ^ «Machine Epsilon Value for IEEE Double Precision Standard Alternative Proof Using Relative Error». 12 October 2020. Retrieved 5 May 2022.
  • Anderson, E.; LAPACK Users’ Guide, Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, third edition, 1999.
  • Cody, William J.; MACHAR: A Soubroutine to Dynamically Determine Machine Parameters, ACM Transactions on Mathematical Software, Vol. 14(4), 1988, 303-311.
  • Besset, Didier H.; Object-Oriented Implementation of Numerical Methods, Morgan & Kaufmann, San Francisco, CA, 2000.
  • Demmel, James W., Applied Numerical Linear Algebra, Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, 1997.
  • Higham, Nicholas J.; Accuracy and Stability of Numerical Algorithms, Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, second edition, 2002.
  • Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; and Flannery, Brian P.; Numerical Recipes in Fortran 77, 2nd ed., Chap. 20.2, pp. 881–886
  • Forsythe, George E.; Malcolm, Michael A.; Moler, Cleve B.; «Computer Methods for Mathematical Computations», Prentice-Hall, ISBN 0-13-165332-6, 1977

External links[edit]

  • MACHAR, a routine (in C and Fortran) to «dynamically compute machine constants» (ACM algorithm 722)
  • Diagnosing floating point calculations precision, Implementation of MACHAR in Component Pascal and Oberon based on the Fortran 77 version of MACHAR published in Numerical Recipes (Press et al., 1992).

Определяем машинный ноль, машинную бесконечность и машинный эпсилон

Доверять расчёту, сделанному на компьютере, без тени понимания того, как именно выполнен этот расчёт — одна из худший вещей, которые может допустить в своей работе инженер. К сожалению, уже нередки «специалисты», которых не смущает ненулевой результат, полученный при умножении на ноль, или, напротив, ноль там, где теоретически нуля быть не должно.

Поэтому повторим в этой заметке несколько азбучных истин о представлении вещественных чисел в компьютере и правилах выполнения операций с ними.

В IBM-совместимой ЭВМ для вещественных чисел используется двоичная система счисления и принята форма представления чисел с плавающей точкой вида

x = m*2p, где мантисса m = ± (g1*2-1 +
g2*2-2 + ... +
gt*2-t)
,

g1, ..., gt — двоичные цифры, причём, g1=1, а целое значение p называется двоичным порядком. Количество цифр t, которое отводится для записи мантиссы, называется разрядностью мантиссы. Диапазон представления чисел в ЭВМ ограничен конечной разрядностью мантиссы и значением числа p.

Все представимые на ЭВМ вещественные числа x удовлетворяют неравенствам
0 < X0 ≤ |x| < X, где
X0 = 2-pmax+1,
X = 2pmax, а значение pmax соответствует разрядности вычислительной системы.

Все числа, по модулю большие X, не представимы на ЭВМ и рассматриваются как машинная бесконечность. Все числа, по модулю меньшие X0, для компьютера не отличаются от нуля и рассматриваются как машинный ноль. Машинным эпсилон εM называется относительная точность ЭВМ, то есть граница относительной погрешности представления вещественных чисел. Можно показать, что εM ≈ 2-t. Пусть
x* = m*2p. Тогда граница абсолютной погрешности представления этого числа равна Δ(x*) ≈ 2-t-1*2p. Поскольку 1/2≤m<1, то величина относительной погрешности представления оценивается как
δ(x*) ≈ Δ(x*) / |x*| ≈ (2-t-1*2p) / (m*2p) = 2-t-1 / m ≤ 2-t-1 / 2-1 = 2-t.

Машинное эпсилон определяется разрядностью мантиссы и способом округления чисел, реализованным на конкретной ЭВМ.

Примем следующие способы определения приближённых значений искомых величин:

  • положим X = 2n, где n — первое натуральное число, при котором произошло переполнение;
  • положим X0 = 2-m, где m – первое натуральное число , при котором 2-m совпадает с нулем;
  • положим εM = 2-k, где k – наибольшее натуральное число, при котором сумма вычисленного значения 1+2-k ещё больше 1. Фактически, εM есть граница относительной погрешности представления числа x* ≈ 1.

Дальше задаём это в нужной среде (пакете) и подбираем значения параметров, вот пример для моего MathCAD 15:

машинный ноль, машинная бесконечность и машинный эпсилон в MathCAD 15

машинный ноль, машинная бесконечность и машинный эпсилон в MathCAD 15

А вот что вышло в Visual Studio 2010 при использовании проекта Windows Forms, C++/CLI, библиотеки System::Math и типа данных long double:

Inf: 1024
Zero: 1075
Eps: 53

Код:

//Функции для подсчёта
long double inf (int n) { return Math::Pow(2.,n); }
long double zero (int m) { return Math::Pow(2.,-m); }
long double eps (int k) { return 1.+Math::Pow(2.,-k); }
//...
//Расчёт, сделанный по нажатию кнопки с выводом результатов в метку label1
 label1->Text = "";

 int n=1,m=1,k=1;
 long double res;
 while (1) {
  res=inf(n);
  if (res==Double::PositiveInfinity) break;
  else n++;
 };
 label1->Text +=  "Inf: " + n + Environment::NewLine;

 while (1) {
  res=zero(m);
  if (res==0.) break;
  else m++;
 };
 label1->Text +=  "Zero: " + m + Environment::NewLine;

 while (1) {
  res=eps(k);
  if (res==1.) break;
  else k++;
 };
 label1->Text +=  "Eps: " + k + Environment::NewLine;

Ну и пара стандартных напоминаний напоследок:

К вещественным значениям в общем случае неприменима операция == («сравнение») из-за неточного представления этих значений в памяти компьютера. Поэтому для вещественных переменных отношение вида a==b обычно заменяется на fabs(a-b)≤eps, где fabs() — функция вычисления модуля вещественного числа, а eps — малая величина, определяющая допустимую погрешность.

Допустимую погрешность можно ввести в расчёт также через стандартный метод округления round, например, левый расчёт произведения чисел в MathCAD не даст нуля, а правый — да:

учёт погрешностей через метод round (Mathcad)

учёт погрешностей через метод round (Mathcad)

27.10.2015, 17:32 [26341 просмотр]


Машинный эпсилон

Как
известно, существует 2 вида погрешностей
вычисления — абсолютная и относительная
(Ошибки
вычислений
).
Под относительной погрешностью понимается
отношение

где

значение, полученное при округлении, а

точное значение вычислений.

Представим,
что результатом округления действительного
числа стало число
.
Худшему случаю округления соответствует
абсолютная погрешность, равная
,
где
.
В мантиссе результата округления
позиций
, в мантиссе абсолютной погрешности
позиция.

При
попытке написать неравенство для
относительной погрешности, соответствующей
упомянутой выше абсолютной погрешности,
несложно получить, что

.

Величину
принято
называть машинным
эпсилоном

(machine
epsilon
).
Таким образом можно утверждать, что при
округлении дробного числа ближайшим к
нему числом с плавающей точкой
относительная погрешность округления
не превосходит машинного эпсилона.

Существует
и другое определение. Машинный эпсилон
можно определить как минимальное
положительное число, которое будучи
прибавлено к единице даёт результат
отличный от единицы. Читателю предлагается
проверить эквивалентность этих
определений самостоятельно.

Стандарт
IEEE

Существует
два разных стандарта IEEE для чисел с
плавающей точкой. IEEE 754 — двоичный стандарт
и требует, чтобы
,
а
для
одинарной точности (single)
и
для
двойной точности (double).
Также в стандарте IEEE 754 точно обговорено
использование битов при представлении
чисел в одинарной и двойной точностях.
В стандарте IEEE 854
может
принимать значение 10 или 2. Также ничего
не говорится о распределении битов
между мантиссой и степенью.

Понятие
стандарт
IEEE

используется для обозначения свойств,
присущих обоим из перечисленных
стандартов.

Основание
степени

Выбор
в качестве основания степени 10 не требует
особых разъяснений. Десятичная система
— система, привычная для человека. В
случае двоичной системы стоит обсудить
некоторые достоинства, присущие ей. Мы
договорились использовать нормализованные
формы чисел. Если
,
то в старшей позиции может стоять только
1. Это даёт нам возможность не хранить
эту единицу в памяти и тем самым получить
дополнительный бит для мантиссы. В этом
случае принято говорить, что стандарт
использует скрытый
бит

(hidden
bit
).

Вернёмся
к вопросу о представлении нуля в
нормализованной форме. Ноль соответствует
нулевой мантиссе и степени
.
Таким образом ноль представляется в
виде
.

Точность представления

Стандарт
IEEE предлагает 4 разных точности: одинарная
(single),
двойная (double),
одинарная расширенная (single-extended)
и двойная расширенная (double-extended).
IEEE 754 жёстко обговаривают число бит
одинарной и двойной точности. Это
означает, что на всех ЭВМ, поддерживающих
IEEE 754, количество бит в представлении
чисел с одинарной точностью и с двойной
точностью фиксированы. Количество бит
расширенных точностей жёстко не
фиксируется. Расширенные форматы
призваны хоть немного увеличить
количество бит на мантиссу и на показатель
степени. Ниже представлена таблица
параметров различных точностей в
стандарте IEEE.

Форматы

Параметры

Формат

Single

Single-extended

Double

Double-extended

p

24

32

53

64

+127

1023

+1023

-126

-1022

Показатель
степени

8
бит

бит

11
бит

15
бит

Длинна
записи

32
бит

43
бит

64
бит

79
бит

Приведём
ещё одну таблицу для наглядности.

Single

Double

Самое
маленькое нормализованное число

(примерно
)

(примерно
)

Самое
большое нормализованное число

(примерно
)

(примерно
)

Машинный
эпсилон

Соседние файлы в папке вычМатКурсач

  • #
  • #
  • #
  • #
  • #
  • #

Машинный эпсилон — это наименьшее число eps, такое что eps+1=1.

Это заведомо неправильное определение. Нужно хотя бы заменить «наименьшее» на «наибольшее».
[Слово «наименьшее» будет фигурировать в таком определении машинного $varepsilon$:
Машинное $varepsilon$ — это такое минимальное положительное число, которое при прибавлении к 1 даёт следующее за 1 число, т.е. наименьшее большее 1.]

[Дальше для случая нормализованных чисел.]

Если машинное $varepsilon$ определяется как максимальная предельная относительная погрешность представления числа, то оно равно $2^{-p}/2$, где $p$ — число отводимых для дробной части числа бит (т.е. без целой единицы). Для binary32 (Single) $p$ равно 23 ($varepsilon$ приближенно равно $5.960464478cdot 10^{-8}$), для binary64 (Double) $p$ равно 52 ($varepsilon$ приближенно равно $1.110223025 cdot 10^{-16}$). В этом определении предполагается, что при округлении погрешность не более половины младшего бита.

Если машинное $varepsilon$ определяется как разность между 1 и ближайшему к нему числу большему 1, то оно равно $2^{-p}$. Такое определение eps используется в Scilab [см «epsilon (floating-point relative accuracy)»], Octave, Matlab (можно проверить, вызвав соответствующую функцию eps).

Вроде так.

Машинный эпсилон дает верхнюю границу для относительной ошибки из-за округления в арифметике с плавающей запятой. Это значение характеризует компьютерную арифметику в области числового анализа и, соответственно, в предмете вычислительной науки. Величина также называется мачепс или округление единиц и обозначается греческими символами эпсилон ϵ { displaystyle epsilon} epsilon или полужирный Роман и соответственно.

Содержание

  • 1 Значения для стандартной аппаратной арифметики с плавающей запятой
  • 2 Формальное определение
  • 3 Арифметическая модель
  • 4 Определения вариантов
  • 5 Как определить машинный эпсилон
    • 5.1 Аппроксимация
  • 6 См. Также
  • 7 Примечания и ссылки
  • 8 Внешние ссылки

Значения для стандартной аппаратной арифметики с плавающей запятой

Следующие значения машинного эпсилон применяются к стандартным форматам с плавающей запятой:

IEEE 754 — 2008 Общепринятое имя Тип данных C ++ Base b { displaystyle b}b Precision p { displaystyle p}p Машинный эпсилон b — (p — 1) / 2 { displaystyle b ^ {- (p-1)} / 2}b ^ {- (p-1)} / 2 Машинный эпсилон b — (p — 1) { displaystyle b ^ {- (p-1)}}b ^ {- (p-1)}
binary16 половинная точность Н / Д 2 11 (один бит неявный) 2 ≈ 4.88e-04 2 ≈ 9.77e-04
binary32 одинарная точность float 2 24 (один бит неявный) 2 ≈ 5.96e-08 2 ≈ 1.19e-07
binary64 двойной точности double 2 53 (один бит неявный) 2 ≈ 1.11e-16 2 ≈ 2.22e-16
расширенная точность, long double _float80 2 64 2 ≈ 5.42e-20 2 ≈ 1.08e-19
binary128 четверная (ruple) точность _float128 2 113 (один бит неявный) 2 ≈ 9,63e-35 2 ≈ 1,93e-34
decimal32 десятичное число одинарной точности _Decimal32 10 7 5 × 10 10
decimal64 десятичное с двойной точностью _Decimal64 10 16 5 × 10 10
decimal128 четверное (ruple) десятичное число с точностью до _Decimal128 10 34 5 × 10 10

Формальное определение

Округление — это процедура выбора представления действительного числа в системе счисления с плавающей запятой. Для системы счисления и процедуры округления машинный эпсилон — это максимальная относительная ошибка выбранной процедуры округления.

Необходима некоторая предыстория, чтобы определить значение из этого определения. Система счисления с плавающей запятой характеризуется основанием, которое также называется основанием, b { displaystyle b}b , и точностью p { displaystyle p}p , то есть количество цифр в системе счисления b { displaystyle b}b в мантиссе (включая любые ведущие неявные немного). Все числа с одинаковой степенью , e { displaystyle e}e, имеют интервал be — (p — 1) { displaystyle b ^ { e- (p-1)}}b^{e-(p-1)}. Интервал изменяется в числах, которые являются полной степенью b { displaystyle b}b ; расстояние на стороне большей величины в b { displaystyle b}b раз больше, чем расстояние на стороне меньшей величины.

Поскольку машинный эпсилон — это предел относительной ошибки, достаточно рассматривать числа с показателем e = 0 { displaystyle e = 0}e=0. Также достаточно рассматривать положительные числа. Для обычного типа округления от округления до ближайшего абсолютная ошибка округления составляет не более половины интервала, или b — (p — 1) / 2 { displaystyle b ^ {- (p-1)} / 2}b ^ {- (p-1)} / 2 . Это значение является наибольшим числителем относительной ошибки. Знаменатель в относительной ошибке — это округляемое число, которое должно быть как можно меньше, чтобы относительная ошибка была большой. Таким образом, наихудшая относительная ошибка возникает, когда округление применяется к числам вида 1 + a { displaystyle 1 + a}1+a, где a { displaystyle a}a находится между 0 { displaystyle 0}{ displaystyle 0} и b — (p — 1) / 2 { displaystyle b ^ {- (p-1)} / 2}b ^ {- (p-1)} / 2 . Все эти числа округляются до 1 { displaystyle 1}1с относительной погрешностью a / (1 + a) { displaystyle a / (1 + a)}a / (1 + a) . Максимум происходит, когда a { displaystyle a}a находится в верхнем конце своего диапазона. 1 + a { displaystyle 1 + a}1+aв знаменателе пренебрежимо мало по сравнению с числителем, поэтому для удобства оно опущено и просто b — (p — 1) / 2 { displaystyle b ^ {- (p-1)} / 2}b ^ {- (p-1)} / 2 принимается как машинный эпсилон. Как было показано здесь, относительная ошибка наихудшая для чисел, округляющихся до 1 { displaystyle 1}1, поэтому машинный эпсилон также называется единичным округлением, что означает примерно «максимальную ошибку, которая может возникнуть, когда округление до стоимости единицы ».

Таким образом, максимальный интервал между нормализованным числом с плавающей запятой x { displaystyle x}x и соседним нормализованным числом составляет 2 ϵ { displaystyle 2 эпсилон}2epsilonx | х | { displaystyle | x |}| x | .

Арифметическая модель

Численный анализ использует машинный эпсилон для изучения эффектов ошибки округления. Фактические ошибки машинной арифметики слишком сложны для непосредственного изучения, поэтому вместо этого используется следующая простая модель. Стандарт арифметики IEEE гласит, что все операции с плавающей запятой выполняются так, как если бы можно было выполнить операцию с бесконечной точностью, а затем результат округляется до числа с плавающей запятой. Предположим, (1) x { displaystyle x}x , y { displaystyle y}y — числа с плавающей запятой, (2) ∙ { displaystyle bullet} bullet — это арифметическая операция над числами с плавающей запятой, такая как сложение или умножение, а (3) ∘ { displaystyle circ} circ — операция бесконечной точности. Согласно стандарту компьютер вычисляет:

x ∙ y = round (x ∘ y) { displaystyle x bullet y = { t_dv {round}} (x circ y)}x  bullet y =  t_dv {round} (x  circ y)

по значению машинного эпсилона, относительная погрешность округления не превышает машинного эпсилон по величине, поэтому:

x ∙ y = (x ∘ y) (1 + z) { displaystyle x bullet y = (x circ y) (1 + z)}x  bullet y = (x  circ y) (1 + z)

где z { displaystyle z}z по абсолютной величине не более ϵ { displaystyle epsilon} epsilon или и . Можно обратиться к книгам Деммеля и Хайэма в справочной литературе, чтобы увидеть, как эта модель используется для анализа ошибок, например, исключения Гаусса.

Определения вариантов

Стандарт IEEE не определяет термины машинный эпсилон и единичное округление, поэтому используются разные определения этих терминов, что может вызвать некоторую путаницу.

Определение, данное здесь для машинного эпсилон, используется профессором Джеймсом Деммелем в сценариях лекций, в пакете линейной алгебры LAPACK, в научных статьях о числовых вычислениях и в некоторых программах для научных вычислений. Большинство численных аналитиков используют слова «машина эпсилон» и «округление единицы измерения» как синонимы с этим значением.

Следующее другое определение гораздо более широко распространено за пределами академических кругов: Машинный эпсилон определяется как разница между 1 и следующим большим числом с плавающей запятой. Согласно этому определению, ϵ { displaystyle epsilon} epsilon равняется значению единицы на последнем месте относительно 1, т.е. b — (p — 1) { displaystyle b ^ {- (p-1)}}b ^ {- (p-1)} , а единичное округление равно u= ϵ / 2 { displaystyle = epsilon / 2}=  epsilon / 2 , предполагая режим округления до ближайшего. Преобладание этого определения связано с его использованием в стандарте ISO C для констант, относящихся к типам с плавающей запятой, и соответствующих констант в других языках программирования. Он также широко используется в программном обеспечении для научных вычислений, а также в числовой и компьютерной литературе.

Как определить машинный эпсилон

Если стандартные библиотеки не предоставляют предварительно вычисленных значений (как <float.h >делает с FLT_EPSILON, DBL_EPSILONи LDBL_EPSILONдля ограничений C и < >работает с std :: numeric_limits <T>:: epsilon ()в C ++), лучший способ определить машинный эпсилон — это обратиться к таблице выше и использовать соответствующую формулу мощности. Эпсилон компьютерной машины часто используется в качестве учебного упражнения. В следующих примерах машинный эпсилон вычисляется в смысле расстояния между числами с плавающей запятой в 1, а не в смысле единичного округления.

Обратите внимание, что результаты зависят от конкретного используемого формата с плавающей запятой, например float, double, long double или аналогичных поддерживаемых языком программирования, компилятором и библиотекой времени выполнения для реальной платформы.

Некоторые форматы, поддерживаемые процессором, могут не поддерживаться выбранным компилятором и операционной системой. Библиотека времени выполнения может эмулировать другие форматы, включая арифметику произвольной точности, доступную на некоторых языках и в библиотеках.

В строгом смысле термин машинный эпсилон означает точность 1 + eps, напрямую поддерживаемую процессором (или сопроцессором), а не некоторую точность 1 + eps, поддерживаемую конкретный компилятор для конкретной операционной системы, если не известно, что он использует лучший формат.

IEEE 754 форматы с плавающей запятой обладают тем свойством, что при повторной интерпретации как целое число с дополнением до двух одинаковой ширины, они монотонно увеличиваются по сравнению с положительными значениями и монотонно уменьшаются по сравнению с отрицательными значениями (см. 32-битные числа с плавающей запятой ). У них также есть свойство 0 < |f(x)| < ∞, and |f(x+1) − f(x)| ≥ |f(x) − f(x−1)| (where f(x) is the aforementioned integer reinterpretation of x). In languages that allow типа punning и всегда использовать IEEE 754-1985, мы можем использовать это для вычисления машинного эпсилон в постоянное время. Например, в C:

typedef union {long long i64; двойной d64; } dbl_64; double machine_eps (двойное значение) {dbl_64 s; s.d64 = значение; s.i64 ++; return s.d64 - значение; }

Результат будет иметь тот же знак, что и значение. Если всегда желателен положительный результат, оператор return для machine_eps можно заменить на:

return (s.i64 < 0 ? value - s.d64 : s.d64 - value);

64-битные числа с двойной точностью дают 2.220446e-16, что, как и ожидалось, равно 2.

Аппроксимация

Следующий простой алгоритм может быть использован для аппроксимации машинного эпсилон с точностью до двух раз (один порядок ) от его истинного значения, используя линейный search.

epsilon = 1.0; while (1.0 + 0.5 * epsilon) ≠ 1.0: epsilon = 0.5 * epsilon

См. также

  • Floating point, общее обсуждение вопросов точности в арифметике с плавающей запятой
  • Модуль на последнем месте (ULP)

Примечания и ссылки

Внешние ссылки

  • MACHAR, процедура (на C и Fortran) для «динамического вычисления машинных констант. «(Алгоритм ACM 722)
  • Диагностика точности вычислений с плавающей запятой, реализация MACHAR в Component Pascal и Oberon на основе Fortran 77 версии MACHAR, опубликованной в Numerical Recipes (Press et al., 1992).

Понравилась статья? Поделить с друзьями:
  • Как найти удаленный контакт в контакте
  • Как правильно составить заявления на прописку ребенка
  • Как найти китайских инвесторов
  • Как составить глоссарий онлайн
  • Программа как найти факториал числа