3 #include <funcy/concepts.h> 4 #include <funcy/util/chainer.h> 5 #include <funcy/util/exceptions.h> 6 #include <funcy/util/macros.h> 25 template <
int div
idend,
int divisor = 1 >
26 struct Pow : Chainer< Pow< dividend, divisor > >
29 explicit Pow(
double x = 1 ) FUNCY_NOEXCEPT
35 void update(
double x ) FUNCY_NOEXCEPT
37 #ifdef FUNCY_ENABLE_EXCEPTIONS 38 if ( k < 3 && x == 0 )
40 std::to_string( divisor ) +
">",
41 "]-inf,inf[ \\ {0}", x, __FILE__, __LINE__ );
43 xk = x * ( xk1 = x * ( xk2 = x * ( xk3 =
::pow( x, k - 3 ) ) ) );
47 [[nodiscard]]
double d0() const noexcept
53 [[nodiscard]]
double d1(
double dx = 1. ) const noexcept
59 [[nodiscard]]
double d2(
double dx = 1.,
double dy = 1. ) const noexcept
61 return k * ( k - 1 ) * xk2 * dx * dy;
65 [[nodiscard]]
double d3(
double dx = 1.,
double dy = 1.,
double dz = 1. ) const noexcept
67 return k * ( k - 1 ) * ( k - 2 ) * xk3 * dx * dy * dz;
71 const double k =
static_cast< double >( dividend ) / divisor;
80 struct Pow< 2, 1 > : Chainer< Pow< 2, 1 > >
83 explicit Pow(
double x_ = 0 ) FUNCY_NOEXCEPT
89 void update(
const double& x_ ) FUNCY_NOEXCEPT
96 [[nodiscard]]
double d0()
const noexcept
102 [[nodiscard]]
double d1(
double dx = 1. )
const noexcept
108 [[nodiscard]]
double d2(
double dx = 1,
double dy = 1 )
const noexcept
114 double x = 0., x2 = 0.;
118 struct Pow< 3, 1 > : Chainer< Pow< 3, 1 > >
121 explicit Pow(
double x_ = 0 ) FUNCY_NOEXCEPT
127 void update(
double x_ ) FUNCY_NOEXCEPT
135 [[nodiscard]]
double d0()
const noexcept
141 [[nodiscard]]
double d1(
double dx = 1 )
const noexcept
147 [[nodiscard]]
double d2(
double dx = 1,
double dy = 1 )
const noexcept
149 return 6 * x * dx * dy;
153 [[nodiscard]]
double d3(
double dx = 1,
double dy = 1,
double dz = 1 )
const noexcept
155 return 6 * dx * dy * dz;
173 struct Pow< -1, 1 > : Chainer< Pow< -1, 1 > >
176 explicit Pow(
double x = 1. ) FUNCY_NOEXCEPT
182 void update(
double x ) FUNCY_NOEXCEPT
184 #ifdef FUNCY_ENABLE_EXCEPTIONS 190 x_inv2 = x_inv * x_inv;
194 [[nodiscard]]
double d0()
const noexcept
200 [[nodiscard]]
double d1(
double dx = 1. )
const noexcept
202 return -1 * x_inv2 * dx;
206 [[nodiscard]]
double d2(
double dx = 1.,
double dy = 1. )
const noexcept
208 return 2 * x_inv2 * x_inv * dx * dy;
212 [[nodiscard]]
double d3(
double dx = 1.,
double dy = 1.,
double dz = 1. )
const noexcept
214 return -6 * x_inv2 * x_inv2 * dx * dy * dz;
223 struct Pow< 1, 2 > : Chainer< Pow< 1, 2 > >
226 explicit Pow(
double x = 0 ) FUNCY_NOEXCEPT
234 #ifdef FUNCY_ENABLE_EXCEPTIONS 243 [[nodiscard]]
double d0()
const noexcept
249 [[nodiscard]]
double d1(
double dx = 1. )
const noexcept
251 return 0.5 / sqrt_x * dx;
255 [[nodiscard]]
double d2(
double dx = 1.,
double dy = 1. )
const noexcept
257 return -0.25 / ( x_ * sqrt_x ) * dx * dy;
261 [[nodiscard]]
double d3(
double dx = 1.,
double dy = 1.,
double dz = 1. )
const noexcept
263 return 0.375 / ( x_ * x_ * sqrt_x ) * dx * dy * dz;
273 struct Pow< -1, 3 > : Chainer< Pow< -1, 3 > >
276 explicit Pow(
double t = 1 ) FUNCY_NOEXCEPT
282 void update(
double x ) FUNCY_NOEXCEPT
284 #ifdef FUNCY_ENABLE_EXCEPTIONS 291 d1val = -1 / ( 3 * p );
293 d2val = 4 / ( 9 * p );
295 d3val = -28 / ( 27 * p );
299 [[nodiscard]]
double d0()
const noexcept
305 [[nodiscard]]
double d1(
double dt = 1 )
const noexcept
311 [[nodiscard]]
double d2(
double dt0 = 1,
double dt1 = 1 )
const noexcept
313 return d2val * dt0 * dt1;
317 [[nodiscard]]
double d3(
double dt0 = 1,
double dt1 = 1,
double dt2 = 1 )
const noexcept
319 return d3val * dt0 * dt1 * dt2;
331 struct Pow< -2, 3 > : Chainer< Pow< -2, 3 > >
334 explicit Pow(
double t = 1. ) FUNCY_NOEXCEPT
340 void update(
double x ) FUNCY_NOEXCEPT
342 #ifdef FUNCY_ENABLE_EXCEPTIONS 350 d1val = -2 / ( 3 * p );
352 d2val = 10 / ( 9 * p );
354 d3val = -80 / ( 27 * p );
358 [[nodiscard]]
double d0()
const noexcept
364 [[nodiscard]]
double d1(
double dt = 1 )
const noexcept
370 [[nodiscard]]
double d2(
double dt0 = 1,
double dt1 = 1 )
const noexcept
372 return d2val * dt0 * dt1;
376 [[nodiscard]]
double d3(
double dt0 = 1,
double dt1 = 1,
double dt2 = 1 )
const noexcept
378 return d3val * dt0 * dt1 * dt2;
403 template < Function F >
404 [[nodiscard]]
auto sqrt(
const F& f )
414 template < Function F >
415 [[nodiscard]]
auto cbrt(
const F& f )
425 template < Function F >
426 [[nodiscard]]
auto cbrt2(
const F& f )
438 template <
int k,
int l, Function F >
439 [[nodiscard]]
auto pow(
const F& f )
450 template <
int k, Function F >
451 [[nodiscard]]
auto pow(
const F& f )
Pow< 1, 3 > Cbrt
Third root (based on sqrt(double) in <cmath>).
Definition: pow.h:393
double d1(double dx=1.) const noexcept
First (directional) derivative.
Definition: pow.h:53
double d0() const noexcept
Function value.
Definition: pow.h:47
auto cbrt(const F &f)
Generate .
Definition: pow.h:415
Pow(double x=1) FUNCY_NOEXCEPT
Constructor.
Definition: pow.h:29
Exception for scalar function arguments that are outside the domain of the function.
Definition: exceptions.h:21
auto sqrt(const F &f)
Generate .
Definition: pow.h:404
auto pow(const F &f)
Generate .
Definition: pow.h:439
Main namespace of the funcy library.
Power function with rational exponent including first three derivatives.
Definition: pow.h:26
double d3(double dx=1., double dy=1., double dz=1.) const noexcept
Third (directional) derivative.
Definition: pow.h:65
Pow< 1, 2 > Sqrt
Square root (based on sqrt(double) in <cmath>).
Definition: pow.h:390
double d2(double dx=1., double dy=1.) const noexcept
Second (directional) derivative.
Definition: pow.h:59
Pow< 2, 3 > Cbrt2
Third root squared (based on sqrt(double) in <cmath>).
Definition: pow.h:396
void update(double x) FUNCY_NOEXCEPT
Set point of evaluation.
Definition: pow.h:35
auto cbrt2(const F &f)
Generate .
Definition: pow.h:426