File: trig_hyp.h

package info (click to toggle)
libitpp 4.0.4-2
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 7,520 kB
  • ctags: 6,341
  • sloc: cpp: 51,608; sh: 9,248; makefile: 636; fortran: 8
file content (149 lines) | stat: -rw-r--r-- 5,111 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*!
 * \file
 * \brief Trigonometric and hyperbolic functions - header file
 * \author Tony Ottosson and Adam Piatyszek
 *
 * -------------------------------------------------------------------------
 *
 * IT++ - C++ library of mathematical, signal processing, speech processing,
 *        and communications classes and functions
 *
 * Copyright (C) 1995-2008  (see AUTHORS file for a list of contributors)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 *
 * -------------------------------------------------------------------------
 */

#ifndef TRIG_HYP_H
#define TRIG_HYP_H

#ifndef _MSC_VER
#  include <itpp/config.h>
#else
#  include <itpp/config_msvc.h>
#endif

#include <itpp/base/help_functions.h>


//! \addtogroup hypfunc
//!@{

#ifndef HAVE_ASINH
//! Arcus sinhyp
inline double asinh(double x)
{
  return ((x >= 0) ? log(x + sqrt(x * x + 1)) : -log( -x + sqrt(x * x + 1)));
}
#endif

#ifndef HAVE_ACOSH
//! Arcus coshyp
inline double acosh(double x)
{
  it_error_if(x < 1, "acosh(): Argument must be greater then 1.");
  return log(x + sqrt(x * x - 1.0));
}
#endif

#ifndef HAVE_ATANH
//! Arcus tanhyp
inline double atanh(double x)
{
  it_error_if(fabs(x) >= 1,"atanh(): Argument out of range.");
  return 0.5 * log((x + 1) / (x - 1));
}
#endif

//!@}


namespace itpp {

  //!\addtogroup trifunc
  //!@{

  //! Sinc function: sinc(x) = sin(pi*x)/pi*x
  inline double sinc(double x)
  {
    return ((x == 0) ? 1.0 : sin(itpp::pi * x) / itpp::pi / x);
  }

  //! Sine function
  inline vec sin(const vec &x) { return apply_function<double>(std::sin, x); }
  //! Sine function
  inline mat sin(const mat &x) { return apply_function<double>(std::sin, x); }
  //! Cosine function
  inline vec cos(const vec &x) { return apply_function<double>(std::cos, x); }
  //! Cosine function
  inline mat cos(const mat &x) { return apply_function<double>(std::cos, x); }
  //! Tan function
  inline vec tan(const vec &x) { return apply_function<double>(std::tan, x); }
  //! Tan function
  inline mat tan(const mat &x) { return apply_function<double>(std::tan, x); }
  //! Inverse sine function
  inline vec asin(const vec &x) { return apply_function<double>(std::asin, x); }
  //! Inverse sine function
  inline mat asin(const mat &x) { return apply_function<double>(std::asin, x); }
  //! Inverse cosine function
  inline vec acos(const vec &x) { return apply_function<double>(std::acos, x); }
  //! Inverse cosine function
  inline mat acos(const mat &x) { return apply_function<double>(std::acos, x); }
  //! Inverse tan function
  inline vec atan(const vec &x) { return apply_function<double>(std::atan, x); }
  //! Inverse tan function
  inline mat atan(const mat &x) { return apply_function<double>(std::atan, x); }
  //! Sinc function, sin(pi*x)/(pi*x)
  inline vec sinc(const vec &x) { return apply_function<double>(sinc, x); }
  //! Sinc function, sin(pi*x)/(pi*x)
  inline mat sinc(const mat &x) { return apply_function<double>(sinc, x); }

  //!@}


  //!\addtogroup hypfunc
  //!@{

  //! Sine hyperbolic function
  inline vec sinh(const vec &x) { return apply_function<double>(std::sinh, x); }
  //! Sine hyperbolic function
  inline mat sinh(const mat &x) { return apply_function<double>(std::sinh, x); }
  //! Cosine hyperbolic function
  inline vec cosh(const vec &x) { return apply_function<double>(std::cosh, x); }
  //! Cosine hyperbolic function
  inline mat cosh(const mat &x) { return apply_function<double>(std::cosh, x); }
  //! Tan hyperbolic function
  inline vec tanh(const vec &x) { return apply_function<double>(std::tanh, x); }
  //! Tan hyperbolic function
  inline mat tanh(const mat &x) { return apply_function<double>(std::tanh, x); }
  //! Inverse sine hyperbolic function
  inline vec asinh(const vec &x) { return apply_function<double>(::asinh, x); }
  //! Inverse sine hyperbolic function
  inline mat asinh(const mat &x) { return apply_function<double>(::asinh, x); }
  //! Inverse cosine hyperbolic function
  inline vec acosh(const vec &x) { return apply_function<double>(::acosh, x); }
  //! Inverse cosine hyperbolic function
  inline mat acosh(const mat &x) { return apply_function<double>(::acosh, x); }
  //! Inverse tan hyperbolic function
  inline vec atanh(const vec &x) { return apply_function<double>(::atanh, x); }
  //! Inverse tan hyperbolic function
  inline mat atanh(const mat &x) { return apply_function<double>(::atanh, x); }

  //!@}

} // namespace itpp

#endif // #ifndef TRIG_HYP_H