Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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 expo-
       nent
	    // 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 big-
       ger
	    // 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_lim-
       its<T>::epsilon(), 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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::numeric_limits::epsilon&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help