Машинний епсилон

верхня межа відносної похибки округлення чисел із рухомою комою

Машинний епсилон (англ. Machine epsilon) — верхня межа відносної похибки округлення чисел із рухомою комою. Абсолютне значення «машинного епсилон» залежить від розрядності сітки застосовуваної ЕОМ, типу (розрядності) використовуваних у розрахунках чисел, і від прийнятої в конкретному трансляторі структури подання дійсних чисел (кількості бітів, що відводяться на мантису і на порядок).[1] Формально машинний епсилон зазвичай визначають як найменше з чисел ε, для якого під час машинних розрахунків з числами даного типу 1+ε>1[2][3]. Альтернативне визначення — найбільше ε, для якого справедлива рівність 1+ε=1.

Подання машинного нуля в числах з рухомою комою за двозначного порядку

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

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

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

Мова Сі

У мові Сі існують граничні константи 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 <iostream># include <stdint.h># include <iomanip>template<typename float_t, typename int_t>float_t machine_eps(){union{float_t f;int_t  i;} one, one_plus, little, last_little;one.f  = 1.0;little.f = 1.0;last_little.f = little.f;while(true){one_plus.f = one.f;one_plus.f += little.f;if( one.i != one_plus.i ){last_little.f = little.f;little.f /= 2.0;}else{return last_little.f;}}}int main(){std::cout << "machine epsilon:\n";std::cout << "float: " << std::setprecision(18)<< machine_eps<float, uint32_t>() << std::endl;std::cout << "double: " << std::setprecision(18) << machine_eps<double, uint64_t>() << std::endl;}

Приклад на Python

def 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 [1]: machineEpsilon(int)Out[1]: 1
In [2]: machineEpsilon(float)Out[2]: 2.2204460492503131e-16
In [3]: machineEpsilon(complex)Out[3]: (2.2204460492503131e-16+0j)

Див. також

Примітки

🔥 Top keywords: Головна сторінкаЧемпіонат Європи з футболу 2024Спеціальна:ПошукВікіпедія:Культурна спадщина та видатні постаті (2024)Збірна України з футболуБріджертониЧемпіонат Європи з футболу 2020YouTubeУкраїнаЧемпіонат Європи з футболуЗбірна Румунії з футболуРебров Сергій СтаніславовичГлобальний саміт мируРадіо «Свобода»ДефолтРумуніяЛунін Андрій ОлексійовичНаціональна суспільна телерадіокомпанія УкраїниДень батькаДовбик Артем ОлександровичШевченко Андрій МиколайовичЯрмоленко Андрій МиколайовичЧемпіонат Європи з футболу 2024 (кваліфікаційний раунд)Мудрик Михайло Петрович138-ма зенітна ракетна бригада (Україна)FacebookЄрмак Андрій БорисовичСексВійськові звання України22-га окрема механізована бригада (Україна)Зінченко Олександр ВолодимировичТериторіальний центр комплектування та соціальної підтримкиДумками навиворіт 2Чемпіонат Європи з футболу 2016Список операторів систем розподілу України2024 у телебаченніMegogoСписок українських жіночих іменКиїв