USRP Hardware Driver and USRP Manual Version: 4.4.0.0
UHD and USRP Manual
 
Loading...
Searching...
No Matches
fp_compare_epsilon.ipp
Go to the documentation of this file.
1//
2// Copyright 2014 Ettus Research LLC
3// Copyright 2018 Ettus Research, a National Instruments Company
4//
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
7
8
9#include <cmath>
10#include <typeinfo>
11
12
13#pragma once
14
15
16namespace uhd { namespace math { namespace fp_compare {
17
18 template<> UHD_INLINE
20
21 _value = value;
22 _epsilon = SINGLE_PRECISION_EPSILON;
23 }
24
25 template<> UHD_INLINE
27 _value = value;
28 _epsilon = DOUBLE_PRECISION_EPSILON;
29 }
30
31 template<typename float_t> UHD_INLINE
33 : _value(value),
34 _epsilon(epsilon)
35 { /* NOP */ }
36
37 template<typename float_t> UHD_INLINE
39 : _value(copy._value),
40 _epsilon(copy._epsilon)
41 { /* NOP */ }
42
43 template<typename float_t> UHD_INLINE
45 { /* NOP */ }
46
47 template<typename float_t> UHD_INLINE
49 _value = copy._value;
50 _epsilon = copy._epsilon;
51 }
52
53 template <typename float_t>
56 {
57 // If raw bit values are equal, then they're equal. This also catches
58 // the case where both are 0.0!
59 if (lhs._value == rhs._value) {
60 return true;
61 }
62
63 // If one of them is within epsilon of zero, but the other is not, then
64 // they're also not equal.
65 if ((std::abs(lhs._value) <= lhs._epsilon && std::abs(rhs._value) > rhs._epsilon)
66 || (std::abs(lhs._value) > lhs._epsilon
67 && std::abs(rhs._value) <= rhs._epsilon)) {
68 return false;
69 }
70
71 // In all other cases, we use the "close enough with tolerance epsilon"
72 // algorithm as described in math.hpp.
73 const bool lhs_compare = ((std::abs(lhs._value - rhs._value) / std::abs(lhs._value))
74 <= lhs._epsilon);
75 const bool rhs_compare = ((std::abs(lhs._value - rhs._value) / std::abs(rhs._value))
76 <= rhs._epsilon);
77
78 return (lhs_compare || rhs_compare);
79 }
80
81 template<typename float_t> UHD_INLINE
83 return !(lhs == rhs);
84 }
86 template<typename float_t> UHD_INLINE
88 return (lhs != rhs) && (lhs._value < rhs._value);
89 }
90
91 template<typename float_t> UHD_INLINE
93 return !(lhs > rhs);
94 }
95
96 template<typename float_t> UHD_INLINE
98 return (lhs != rhs) && (lhs._value > rhs._value);
99 }
100
101 template<typename float_t> UHD_INLINE
103 return !(lhs < rhs);
104 }
105
106 template <typename float_t>
108 {
109 return lhs == fp_compare_epsilon<float_t>(static_cast<float_t>(rhs));
110 }
111
112 template<typename float_t> UHD_INLINE
114 return !(lhs == rhs);
115 }
116
117 template<typename float_t> UHD_INLINE
119
120 return (lhs != rhs) && (lhs._value < rhs);
121 }
122
123 template<typename float_t> UHD_INLINE
125 return !(lhs > rhs);
126 }
127
128 template<typename float_t> UHD_INLINE
130
131 return (lhs != rhs) && (lhs._value > rhs);
132 }
133
134 template<typename float_t> UHD_INLINE
136 return !(lhs < rhs);
137 }
138
139 template <typename float_t>
141 {
142 return fp_compare_epsilon<float_t>(static_cast<float_t>(lhs)) == rhs;
143 }
144
145 template<typename float_t> UHD_INLINE
147 return !(lhs == rhs);
148 }
149
150 template<typename float_t> UHD_INLINE
152
153 return (lhs != rhs) && (lhs < rhs._value);
154 }
155
156 template<typename float_t> UHD_INLINE
158 return !(lhs > rhs);
159 }
160
161 template<typename float_t> UHD_INLINE
163
164 return (lhs != rhs) && (lhs > rhs._value);
165 }
166
167 template<typename float_t> UHD_INLINE
169 return !(lhs < rhs);
170 }
171
172} } } //namespace uhd::math::fp_compare
float_t _epsilon
Definition math.hpp:90
UHD_INLINE ~fp_compare_epsilon()
Definition fp_compare_epsilon.ipp:44
UHD_INLINE void operator=(const fp_compare_epsilon &copy)
Definition fp_compare_epsilon.ipp:48
float_t _value
Definition math.hpp:89
UHD_INLINE fp_compare_epsilon(float_t value)
#define UHD_INLINE
Definition config.h:65
UHD_INLINE bool operator!=(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:64
UHD_INLINE bool operator<=(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:75
UHD_INLINE bool operator==(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:58
UHD_INLINE bool operator<(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:69
UHD_INLINE bool operator>(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:80
UHD_INLINE bool operator>=(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:86
Definition build_info.hpp:12