Пространства имён
Варианты
Действия

std::numeric_limits::epsilon

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
 
static T epsilon()
(до C++11)
static constexpr T epsilon()
(начиная с C++11)

Возвращает машинный эпсилон, то есть разницу между 1.0 и следующим представимым числом с плавающей запятой T. Эта операция имеет смысл только при std::numeric_limits<T>::is_integer == false.

Содержание

[править] Возвращаемое значение

T std::numeric_limits<T>::epsilon()
/* non-specialized */ T();
bool false
char 0
signed char 0
unsigned char 0
wchar_t 0
char16_t 0
char32_t 0
short 0
unsigned short 0
int 0
unsigned int 0
long 0
unsigned long 0
long long 0
unsigned long long 0
float FLT_EPSILON
double DBL_EPSILON
long double LDBL_EPSILON

[править] Исключения

спецификация noexcept:  
noexcept
  

[править] Пример

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

#include <cmath>
#include <limits>
#include <iomanip>
#include <iostream>
#include <type_traits>
 
template<class T>
typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type
    almost_equal(T x, T y, int ulp)
{
    // эпсилон нужно отмасштабировать на величину наибольшего значения
    // и умножить на желаемую точность в ULP (units in the last place)
    return std::abs(x-y) <=   std::numeric_limits<T>::epsilon()
                            * std::max(std::abs(x), std::abs(y))
                            * ulp;
}
int main()
{
    double d1 = 0.2;
    double d2 = 1 / std::sqrt(5) / std::sqrt(5);
 
    if(d1 == d2)
            std::cout << "d1 == d2\n";
    else
            std::cout << "d1 != d2\n";
 
    if(almost_equal(d1, d2, 2))
            std::cout << "d1 almost equals d2\n";
    else
            std::cout << "d1 != d2\n";
}

Вывод:

d1 != d2
d1 almost equals d2

[править] См. также

(C++11)(C++11) (C++11)(C++11)(C++11)(C++11)
следующее представимое значение с плавающей запятой по направлению к заданному значению
(функция) [править]