hypot.h
Go to the documentation of this file.
1 #ifndef cetlib_hypot_h
2 #define cetlib_hypot_h
3 
4 // ======================================================================
5 //
6 // hypot: Checked and unchecked Euclidean planar hypotenuse calculations
7 //
8 // ======================================================================
9 
10 #include <cmath>
11 #include <limits>
12 #include <type_traits>
13 #include <utility>
14 
15 // ----------------------------------------------------------------------
16 
17 namespace cet {
18  template <class T>
20 
21  template <class T>
23 
24  template <class T>
26 }
27 
28 // ----------------------------------------------------------------------
29 // unchecked_hypot<>:
30 
31 template <class T>
34 {
35  return std::hypot(x, y);
36 }
37 
38 // ----------------------------------------------------------------------
39 // checked_hypot<>:
40 
41 template <class T>
44 {
45 
46  if (std::isinf(x) || std::isinf(y))
47  return std::numeric_limits<T>::infinity();
48  else if (std::isnan(x) || std::isnan(y))
49  return std::numeric_limits<T>::quiet_NaN();
50  else
51  return unchecked_hypot(x, y);
52 
53 } // checked_hypot<>(,)
54 
55 // ----------------------------------------------------------------------
56 // hypot<>:
57 
58 template <class T>
61 {
62  return checked_hypot(x, y);
63 }
64 
65 // ======================================================================
66 
67 #endif /* cetlib_hypot_h */
68 
69 // Local Variables:
70 // mode: c++
71 // End:
int isinf(const stan::math::var &a)
Definition: std_isinf.hpp:16
std::enable_if_t< std::is_arithmetic< T >::value, T > hypot(T x, T y)
Definition: hypot.h:60
std::enable_if_t< std::is_arithmetic< T >::value, T > unchecked_hypot(T x, T y)
Definition: hypot.h:33
int isnan(const stan::math::var &a)
Definition: std_isnan.hpp:18
const XML_Char int const XML_Char * value
Definition: expat.h:331
double T
Definition: Xdiff_gwt.C:5
std::enable_if_t< std::is_arithmetic< T >::value, T > checked_hypot(T x, T y)
Definition: hypot.h:43