funcy  1.6.1
log.h
1 #pragma once
2 
3 #include <funcy/concepts.h>
4 #include <funcy/util/chainer.h>
5 #include <funcy/util/exceptions.h>
6 #include <funcy/util/macros.h>
7 
8 #include <cmath>
9 
10 namespace funcy
11 {
22  struct LN : Chainer< LN >
23  {
25  explicit LN( double x = 1. ) FUNCY_NOEXCEPT
26  {
27  update( x );
28  }
29 
31  void update( double x ) FUNCY_NOEXCEPT
32  {
33 #ifdef FUNCY_ENABLE_EXCEPTIONS
34  if ( x <= 0 )
35  throw OutOfDomainException( "LN", "]0,inf[", x, __FILE__, __LINE__ );
36 #endif
37  x_inv = 1. / x;
38  value = ::log( x );
39  }
40 
42  [[nodiscard]] double d0() const noexcept
43  {
44  return value;
45  }
46 
48  [[nodiscard]] double d1( double dx = 1. ) const noexcept
49  {
50  return x_inv * dx;
51  }
52 
54  [[nodiscard]] double d2( double dx = 1., double dy = 1. ) const noexcept
55  {
56  return -x_inv * x_inv * dx * dy;
57  }
58 
60  [[nodiscard]] double d3( double dx = 1., double dy = 1., double dz = 1. ) const noexcept
61  {
62  return 2 * x_inv * x_inv * x_inv * dx * dy * dz;
63  }
64 
65  private:
66  double value = 0., x_inv = 1.;
67  };
68 
76  struct Log10 : Chainer< Log10 >
77  {
79  explicit Log10( double x = 1. ) FUNCY_NOEXCEPT
80  {
81  update( x );
82  }
83 
85  void update( double x ) FUNCY_NOEXCEPT
86  {
87 #ifdef FUNCY_ENABLE_EXCEPTIONS
88  if ( x <= 0 )
89  throw OutOfDomainException( "Log10", "]0,inf[", x, __FILE__, __LINE__ );
90 #endif
91  x_inv = 1. / x;
92  value = ::log10( x );
93  }
94 
96  [[nodiscard]] double d0() const noexcept
97  {
98  return value;
99  }
100 
102  [[nodiscard]] double d1( double dx = 1. ) const noexcept
103  {
104  return ln10inv * x_inv * dx;
105  }
106 
108  [[nodiscard]] double d2( double dx = 1., double dy = 1. ) const noexcept
109  {
110  return -ln10inv * x_inv * x_inv * dx * dy;
111  }
112 
114  [[nodiscard]] double d3( double dx = 1., double dy = 1., double dz = 1. ) const noexcept
115  {
116  return 2 * ln10inv * x_inv * x_inv * x_inv * dx * dy * dz;
117  }
118 
119  private:
120  double value = 0., x_inv = 1., ln10inv = 1 / log( 10. );
121  };
122 
130  struct Log2 : Chainer< Log2 >
131  {
133  explicit Log2( double x = 1. ) FUNCY_NOEXCEPT
134  {
135  update( x );
136  }
137 
139  void update( double x ) FUNCY_NOEXCEPT
140  {
141 #ifdef FUNCY_ENABLE_EXCEPTIONS
142  if ( x <= 0 )
143  throw OutOfDomainException( "Log2", "]0,inf[", x, __FILE__, __LINE__ );
144 #endif
145  x_inv = 1. / x;
146  value = ::log2( x );
147  }
148 
150  [[nodiscard]] double d0() const noexcept
151  {
152  return value;
153  }
154 
156  [[nodiscard]] double d1( double dx = 1. ) const noexcept
157  {
158  return ln2inv * x_inv * dx;
159  }
160 
162  [[nodiscard]] double d2( double dx = 1., double dy = 1. ) const noexcept
163  {
164  return -ln2inv * x_inv * x_inv * dx * dy;
165  }
166 
168  [[nodiscard]] double d3( double dx = 1., double dy = 1., double dz = 1. ) const noexcept
169  {
170  return 2 * ln2inv * x_inv * x_inv * x_inv * dx * dy * dz;
171  }
172 
173  private:
174  double value = 0., x_inv = 1., ln2inv = 1 / log( 2. );
175  };
176 
177  [[nodiscard]] inline auto ln( double x )
178  {
179  return LN( x )();
180  }
181 
187  template < Function F >
188  [[nodiscard]] auto ln( const F& f )
189  {
190  return LN()( f );
191  }
192 
198  template < Function F >
199  [[nodiscard]] auto log10( const F& f )
200  {
201  return Log10()( f );
202  }
203 
209  template < Function F >
210  [[nodiscard]] auto log2( const F& f )
211  {
212  return Log2()( f );
213  }
215 } // namespace funcy
void update(double x) FUNCY_NOEXCEPT
Set point of evaluation.
Definition: log.h:31
double d1(double dx=1.) const noexcept
First (directional) derivative.
Definition: log.h:156
Common (base 10) logarithm.
Definition: log.h:76
void update(double x) FUNCY_NOEXCEPT
Set point of evaluation.
Definition: log.h:139
double d2(double dx=1., double dy=1.) const noexcept
Second (directional) derivative.
Definition: log.h:108
double d0() const noexcept
Function value.
Definition: log.h:42
Log10(double x=1.) FUNCY_NOEXCEPT
Constructor.
Definition: log.h:79
Exception for scalar function arguments that are outside the domain of the function.
Definition: exceptions.h:21
double d0() const noexcept
Function value.
Definition: log.h:96
LN(double x=1.) FUNCY_NOEXCEPT
Constructor.
Definition: log.h:25
auto log10(const F &f)
Generate .
Definition: log.h:199
double d0() const noexcept
Function value.
Definition: log.h:150
Base 2 logarithm.
Definition: log.h:130
Main namespace of the funcy library.
double d1(double dx=1.) const noexcept
First (directional) derivative.
Definition: log.h:48
double d2(double dx=1., double dy=1.) const noexcept
Second (directional) derivative.
Definition: log.h:162
void update(double x) FUNCY_NOEXCEPT
Set point of evaluation.
Definition: log.h:85
Natural logarithm.
Definition: log.h:22
Log2(double x=1.) FUNCY_NOEXCEPT
Constructor.
Definition: log.h:133
double d1(double dx=1.) const noexcept
First (directional) derivative.
Definition: log.h:102
double d2(double dx=1., double dy=1.) const noexcept
Second (directional) derivative.
Definition: log.h:54
double d3(double dx=1., double dy=1., double dz=1.) const noexcept
Third (directional) derivative.
Definition: log.h:114
auto log2(const F &f)
Generate .
Definition: log.h:210
double d3(double dx=1., double dy=1., double dz=1.) const noexcept
Third (directional) derivative.
Definition: log.h:60
double d3(double dx=1., double dy=1., double dz=1.) const noexcept
Third (directional) derivative.
Definition: log.h:168