funcy  1.6.1
erf.h
1 #pragma once
2 
3 #include <funcy/concepts.h>
4 #include <funcy/util/chainer.h>
5 
6 #include <cmath>
7 
8 namespace funcy
9 {
20  struct Erf : Chainer< Erf >
21  {
23  explicit Erf( double x = 0. ) noexcept
24  {
25  update( x );
26  }
27 
29  void update( double x ) noexcept
30  {
31  x_ = x;
32  value = std::erf( x_ );
33  firstDerivative = scale * std::exp( -x_ * x_ );
34  }
35 
37  [[nodiscard]] double d0() const noexcept
38  {
39  return value;
40  }
41 
43  [[nodiscard]] double d1( double dx = 1. ) const noexcept
44  {
45  return firstDerivative * dx;
46  }
47 
49  [[nodiscard]] double d2( double dx = 1., double dy = 1. ) const noexcept
50  {
51  return -2 * x_ * d1( dx ) * dy;
52  }
53 
55  [[nodiscard]] double d3( double dx = 1., double dy = 1., double dz = 1. ) const noexcept
56  {
57  return ( 4 * x_ * x_ - 2 ) * d1( dx ) * dy * dz;
58  }
59 
60  private:
61  double scale = 2 / std::sqrt( M_PI );
62  double value = 0.;
63  double firstDerivative = 1.;
64  double x_ = 0;
65  };
66 
72  template < Function F >
73  [[nodiscard]] auto erf( const F& f )
74  {
75  return Erf( f() )( f );
76  }
78 } // namespace funcy
auto erf(const F &f)
Generate .
Definition: erf.h:73
double d1(double dx=1.) const noexcept
First (directional) derivative.
Definition: erf.h:43
auto sqrt(const F &f)
Generate .
Definition: pow.h:404
auto exp(const F &f)
Generate .
Definition: exp.h:117
double d2(double dx=1., double dy=1.) const noexcept
Second (directional) derivative.
Definition: erf.h:49
Main namespace of the funcy library.
Erf(double x=0.) noexcept
Constructor.
Definition: erf.h:23
double d0() const noexcept
Function value.
Definition: erf.h:37
Error function.
Definition: erf.h:20
void update(double x) noexcept
Set point of evaluation.
Definition: erf.h:29
double d3(double dx=1., double dy=1., double dz=1.) const noexcept
Third (directional) derivative.
Definition: erf.h:55