funcy  1.6.1
arccos.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 ACos : Chainer< ACos >
23  {
25  explicit ACos( double x = 0. ) FUNCY_NOEXCEPT
26  {
27  update( x );
28  }
29 
31  void update( double x ) FUNCY_NOEXCEPT
32  {
33 #ifdef FUNCY_ENABLE_EXCEPTIONS
34  if ( x < -1 || x > 1 )
35  throw OutOfDomainException( "ACos", "[-1,1]", x, __FILE__, __LINE__ );
36 #endif
37  value = ::acos( x );
38  firstDerivative = -1 / ::sqrt( 1 - ( x * x ) );
39  firstDerivative3 = firstDerivative * firstDerivative * firstDerivative;
40  x_ = x;
41  }
42 
44  [[nodiscard]] double d0() const noexcept
45  {
46  return value;
47  }
48 
50  [[nodiscard]] double d1( double dx = 1 ) const noexcept
51  {
52  return firstDerivative * dx;
53  }
54 
56  [[nodiscard]] double d2( double dx = 1, double dy = 1 ) const noexcept
57  {
58  return x_ * firstDerivative3 * dx * dy;
59  }
60 
62  [[nodiscard]] double d3( double dx = 1, double dy = 1, double dz = 1 ) const noexcept
63  {
64  return firstDerivative3 *
65  ( 1 + ( 3 * x_ * x_ / ( firstDerivative * firstDerivative ) ) ) * dx * dy * dz;
66  }
67 
68  private:
69  double value = 0., firstDerivative = 1., firstDerivative3 = 1., x_ = 0.;
70  };
71 
78  template < Function F >
79  [[nodiscard]] auto acos( const F& f )
80  {
81  return ACos()( f );
82  }
83 } // namespace funcy
auto acos(const F &f)
Generate .
Definition: arccos.h:79
double d1(double dx=1) const noexcept
First (directional) derivative.
Definition: arccos.h:50
double d3(double dx=1, double dy=1, double dz=1) const noexcept
Third (directional) derivative.
Definition: arccos.h:62
Arc cosine function (based on acos(double) in <cmath>).
Definition: arccos.h:22
double d0() const noexcept
Function value.
Definition: arccos.h:44
Exception for scalar function arguments that are outside the domain of the function.
Definition: exceptions.h:21
double d2(double dx=1, double dy=1) const noexcept
Second (directional) derivative.
Definition: arccos.h:56
auto sqrt(const F &f)
Generate .
Definition: pow.h:404
ACos(double x=0.) FUNCY_NOEXCEPT
Constructor.
Definition: arccos.h:25
void update(double x) FUNCY_NOEXCEPT
Set point of evaluation.
Definition: arccos.h:31
Main namespace of the funcy library.