Щоб безпосередньо відповісти на ваше запитання, ви хочете використовувати термін epsilon
. Точніше, machine epsilon
але звичайне використання падає «машина» та просто використовує epsilon
.
Заглядаючи в свою місцеву копію, float.h
я бачу:
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define LDBL_EPSILON DBL_EPSILON /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
І пов'язані з цим коментарі дають зрозуміти, що epsilon - це термін, про який ви посилаєтесь.
Але ми можемо також покластись на деякі інші зовнішні посилання, щоб переконатися, що epsilon
це правильний термін. Дивіться тут , тут , тут , і нарешті це поєднання тегів запитів SO . Я не зміг знайти пряму посилання на стандарт IEEE 754, який я наводив.
Ви не запитували, але я знайшов цю посилання дуже важливою для прикладу, який ви надали для уточнення свого питання.
Погляньте на цю статтю Блога Брюса Доусона з Valve про порівняння значень з плаваючою комою для деякого розуміння того, чому ви не хочете використовувати порівняння, яке ви запропонували.
У цю статтю запаковано досить багато інформації, але це найвідповідніший фрагмент звідти:
Якщо порівнювати поплавці для рівності - це погана ідея, то як щодо перевірки, чи є їх різниця в межах деяких помилок або значення epsilon, як це:
bool isEqual = fabs(f1 – f2) <= epsilon;
Цим розрахунком ми можемо виразити, що два поплавця є досить близькими, що ми хочемо вважати їх рівними. Але яке значення ми повинні використовувати для epsilon?
Враховуючи наші експерименти вище, ми можемо спокуситись використовувати помилку в нашій сумі, яка була приблизно 1,19e-7f. Насправді в float.h є навіть визначення з таким точним значенням, і воно називається FLT_EPSILON.
Ясно, що це все. Боги заголовкового файлу говорили, і FLT_EPSILON - це єдиний справжній епсилон!
Крім того, що це сміття. Для чисел від 1,0 до 2,0 FLT_EPSILON являє собою різницю між суміжними поплавками. Для чисел, менших ніж 1,0, епсилон FLT_EPSILON швидко стає занадто великим, а при достатньо малих числах FLT_EPSILON може бути більшим, ніж числа, які ви порівнюєте!
Доусон переймається досить багатьма іншими міркуваннями щодо тонкощів, пов'язаних із порівнянням поплавків та обробкою дуже малих значень, як це, тому я б закликав вас прочитати решту його публікації.