home | help
std::numeri...ts::epsilon(3)   C++ Standard Libary  std::numeri...ts::epsilon(3)

NAME
     std::numeric_limits::epsilon - std::numeric_limits::epsilon

Synopsis
	static T epsilon() throw();		(until C++11)
	static constexpr T epsilon() noexcept;	(since C++11)

	Returns the machine epsilon, that is, the difference between 1.0 and the
     next value
	representable by the floating-point type T. It is only meaningful if
	std::numeric_limits<T>::is_integer == false.

Return value
	T				std::numeric_limits<T>::epsilon()
	/* non-specialized */		T()
	bool				false
	char				0
	signed char			0
	unsigned char			0
	wchar_t 			0
	char8_t (since C++20)		0
	char16_t (since C++11)		0
	char32_t (since C++11)		0
	short				0
	unsigned short			0
	int				0
	unsigned int			0
	long				0
	unsigned long			0
	long long (since C++11) 	0
	unsigned long long(since C++11) 0
	float				FLT_EPSILON
	double				DBL_EPSILON
	long double			LDBL_EPSILON

Example
	Demonstrates the use of machine epsilon to compare floating-point values
     for
	equality:

     // Run this code

      #include <algorithm>
      #include <cmath>
      #include <cstddef>
      #include <iomanip>
      #include <iostream>
      #include <limits>
      #include <type_traits>

      template <class T>
      std::enable_if_t<not std::numeric_limits<T>::is_integer, bool>
      equal_within_ulps(T x, T y, std::size_t n)
      {
	  // Since `epsilon()` is the gap size (ULP, unit in the last place)
	  // of floating-point numbers in interval [1, 2), we can scale it to
	  // the gap size in interval [2^e, 2^{e+1}), where `e` is the exponent
	  // of `x` and `y`.

	  // If `x` and `y` have different gap sizes (which means they have
	  // different exponents), we take the smaller one. Taking the bigger
	  // one is also reasonable, I guess.
	  const T m = std::min(std::fabs(x), std::fabs(y));

	  // Subnormal numbers have fixed exponent, which is `min_exponent - 1`.
	  const int exp = m < std::numeric_limits<T>::min()
			? std::numeric_limits<T>::min_exponent - 1
			: std::ilogb(m);

	  // We consider `x` and `y` equal if the difference between them is
	  // within `n` ULPs.
	  return  std::fabs(x - y) <= n * std::ldexp(std::numeric_limits<T>::ep-
     silon(), exp);
      }

      int main()
      {
	  double x = 0.3;
	  double y = 0.1 + 0.2;
	  std::cout << std::hexfloat;
	  std::cout << "x = " << x << '\n';
	  std::cout << "y = " << y << '\n';
	  std::cout << (x == y ? "x == y" : "x != y") << '\n';
	  for (std::size_t n = 0; n <= 10; ++n)
	      if (equal_within_ulps(x, y, n))
	      {
		  std::cout << "x equals y within " << n << " ulps" << '\n';
		  break;
	      }
      }

Output:
      x = 0x1.3333333333333p-2
      y = 0x1.3333333333334p-2
      x != y
      x equals y within 1 ulps

See also
	nextafter
	nextafterf
	nextafterl
	nexttoward
	nexttowardf
	nexttowardl next representable floating-point value  towards  the  given
     value
	(C++11)     (function)
	(C++11)
	(C++11)
	(C++11)
	(C++11)
	(C++11)

http://cppreference.com 	   2024.06.10	    std::numeri...ts::epsilon(3)

home | help