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 (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

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

       // Run this code

	#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)
	{
	    //	the  machine  epsilon has to be	scaled to the magnitude	of the
       values used
	    // and multiplied by the desired precision in ULPs (units  in  the
       last place)
	    return   std::fabs(x-y)   <=  std::numeric_limits<T>::epsilon()  *
       std::fabs(x+y) *	ulp
		// unless the result is	subnormal
		|| std::fabs(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 almost	equals d2\n";
	    else
		std::cout << "d1 does not almost equal d2\n";
	}

Output:
	d1=0.20000000000000001110
	d2=0.19999999999999998335
	d1 != d2
	d1 almost equals d2

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		  2022.07.31	  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.0>

home | help