Машинний епсилон () — верхня межа відносної похибки округлення чисел із рухомою комою. Абсолютне значення «машинного епсилон» залежить від розрядності сітки застосовуваної ЕОМ, типу (розрядності) використовуваних у розрахунках чисел, і від прийнятої в конкретному трансляторі структури подання дійсних чисел (кількості бітів, що відводяться на мантису і на порядок). Подбельский В. В., Фомин С. С. Программирование по на языке Си: Учеб.пособие. : Финансы и статистика, 2003. Формально машинний епсилон зазвичай визначають як найменше з чисел ε, для якого під час машинних розрахунків з числами даного типу 1+ε>1. Альтернативне визначення — найбільше ε, для якого справедлива рівність 1+ε=1.

Практична важливість машинного епсилон пов'язана з тим, що два (відмінних від нуля) числа є однаковими з точки зору машинної арифметики, якщо модуль їх відносної різниці менший (за визначенням першого типу) або не перевершує (за визначенням другого типу) машинного епсилон.

Машинний нуль — числове значення з таким від'ємним порядком, що воно сприймається обчислювальною машиною як нуль.

У мовах програмування

Мова Сі У мові Сі існують граничні константи FLT_EPSILON, DBL_EPSILON і LDBL_EPSILON, які є «машинними епсилон», відповідними першому визначенню: FLT_EPSILON = 2−23 ≈ 1.19e−07 — це машинний епсилон для чисел типу float (32 біти), DBL_EPSILON = 2−52 ≈ 2.20e−16 — для типу double (64 біти), і LDBL_EPSILON = 2−63 ≈ 1.08e−19 — для типу long double (80 біт). Для альтернативного визначення відповідні машинні епсилон будуть вдвічі меншими: 2−24, 2−53 і 2−64. У деяких компіляторах Сі (наприклад gcc, Intel's C/C++ compiler) допускається використання змінних четверної точності (_float128, _Quad). Відповідні машинні епсилон рівні 2−112 ≈ 1.93e−34 і 2−113 ≈ 9.63e−35.

Приклад Приклад обчислення машинного епсилона мовою Сі.float macheps(void) { float e = 1.0f;

while (1.0f + e / 2.0f > 1.0f) e /= 2.0f; return e; } Приклад мовою C++.#include <limits>

int main() { std::cout << "machine epsilon:\n"; std::cout << "float: " << std::setprecision(18)<< std::numeric_limits<float>::epsilon() << std::endl; std::cout << "double: " << std::setprecision(18) << std::numeric_limits<double>::epsilon() << std::endl; } Приклад на Pythondef machineEpsilon(func=float): machine_epsilon = func(1) while func(1)+func(machine_epsilon) != func(1): machine_epsilon_last = machine_epsilon machine_epsilon = func(machine_epsilon) / func(2) return machine_epsilon_last Виведення може бути таким (з використанням IPython): In : machineEpsilon(int) Out: 1

In : machineEpsilon(float) Out: 2.2204460492503131e-16

In : machineEpsilon(complex) Out: (2.2204460492503131e-16+0j)

Див. також −0 (програмування)

Примітки