std::numeric_limits<T>::epsilon

来自cppreference.com
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(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() throw();
(C++11 前)
static constexpr T epsilon() noexcept;
(C++11 起)

返回机器 epsilon,即 1.0 与浮点类型 T 的下个可表示值的差。它只有在 std::numeric_limits<T>::is_integer == false 时才有意义。

返回值

T std::numeric_limits<T>::epsilon()
/* 未特化 */ T()
bool false
char 0
signed char 0
unsigned char 0
wchar_t 0
char8_t (C++20 起) 0
char16_t (C++11 起) 0
char32_t (C++11 起) 0
short 0
unsigned short 0
int 0
unsigned int 0
long 0
unsigned long 0
long long (C++11 起) 0
unsigned long long(C++11 起) 0
float FLT_EPSILON
double DBL_EPSILON
long double LDBL_EPSILON

示例

演示用机器 epsilon 比较浮点值是否相等:

#include <cmath>
#include <limits>
#include <iomanip>
#include <iostream>
#include <type_traits>
#include <algorithm>
 
template<class T>
typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type
    almost_equal(T x, T y, int ulp)
{
    // 机器 epsilon 需要调整到要使用的值的量级,
    // 并且乘以以 ULP(最后位置单位)为单位的想要的精度
    return std::abs(x - y) <= std::numeric_limits<T>::epsilon() * std::abs(x + y) * ulp
        // unless the result is subnormal
        || std::abs(x - y) < std::numeric_limits<T>::min();
}
 
int main()
{
    double d1 = 0.2;
    double d2 = 1 / std::sqrt(5) / std::sqrt(5);
    std::cout << std::fixed << std::setprecision(20) 
              << "d1=" << d1 << "\nd2=" << d2 << '\n';
 
    if (d1 == d2)
        std::cout << "d1 == d2\n";
    else
        std::cout << "d1 != d2\n";
 
    if (almost_equal(d1, d2, 2))
        std::cout << "d1 几乎等于 d2\n";
    else
        std::cout << "d1 不几乎等于 d2\n";
}

输出:

d1=0.20000000000000001110
d2=0.19999999999999998335
d1 != d2
d1 几乎等于 d2

参阅

(C++11)(C++11) (C++11)(C++11)(C++11)(C++11)
趋向给定值的下个可表示浮点值
(函数)