isce3 0.25.0
Loading...
Searching...
No Matches
Sinc.icc
1#include <cmath>
2#include <limits>
3#include <type_traits>
4
5namespace isce3 { namespace math {
6
7namespace detail {
8
9template<typename T>
10inline
11T root_epsilon()
12{
13 static constexpr T eps = std::numeric_limits<T>::epsilon();
14 return std::sqrt(eps);
15}
16
17template<>
18constexpr
19float root_epsilon<float>()
20{
21 return static_cast<float>(0.00034526698300124390839884978618400831996329879769945L);
22}
23
24template<>
25constexpr
26double root_epsilon<double>()
27{
28 return static_cast<double>(0.1490116119384765625e-7L);
29}
30
31template<>
32constexpr
33long double root_epsilon<long double>()
34{
35 return static_cast<long double>(0.32927225399135962333569506281281311031656150598474e-9L);
36}
37
38template<typename T>
39inline
40T fourth_root_epsilon()
41{
42 return std::sqrt(root_epsilon<T>());
43}
44
45template<>
46constexpr
47float fourth_root_epsilon<float>()
48{
49 return static_cast<float>(0.018581361171917516667460937040007436176452688944747L);
50}
51
52template<>
53constexpr
54double fourth_root_epsilon<double>()
55{
56 return static_cast<double>(0.0001220703125L);
57}
58
59template<>
60constexpr
61long double fourth_root_epsilon<long double>()
62{
63 return static_cast<long double>(0.18145860519450699870567321328132261891067079047605e-4L);
64}
65
66} // namespace detail
67
68template<typename T>
69CUDA_HOSTDEV
70inline
71T sinc(T t)
72{
73 static_assert(std::is_floating_point<T>::value);
74
75 using U = typename std::remove_cv<T>::type;
76 static constexpr auto eps1 = detail::root_epsilon<U>();
77 static constexpr auto eps2 = detail::fourth_root_epsilon<U>();
78
79 auto x = T(M_PI) * std::abs(t);
80
81 // approximate by Taylor series expansion near zero
82 if (x < eps2) {
83 auto out = static_cast<T>(1);
84 if (x > eps1) {
85 out -= x * x / static_cast<T>(6);
86 }
87 return out;
88 }
89
90 return std::sin(x) / x;
91}
92
93}}
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5

Generated for ISCE3.0 by doxygen 1.13.2.