IT++ Logo
log_exp.h
Go to the documentation of this file.
1 
29 #ifndef LOG_EXP_H
30 #define LOG_EXP_H
31 
33 #include <itpp/itexports.h>
34 
35 namespace itpp
36 {
37 
40 
41 // ----------------------------------------------------------------------
42 // scalar functions
43 // ----------------------------------------------------------------------
44 
46 inline double logb(double b, double x)
47 {
48  return (std::log(x) / std::log(b));
49 }
50 
52 inline int pow2i(int x) { return ((x < 0) ? 0 : (1 << x)); }
54 inline double pow2(double x) { return pow(2.0, x); }
55 
57 inline double pow10(double x) { return pow(10.0, x); }
58 
60 inline double dB(double x) { return 10.0 * log10(x); }
62 inline double inv_dB(double x) { return pow(10.0, 0.1 * x); }
63 
65 inline int int2bits(int n)
66 {
67  it_assert(n >= 0, "int2bits(): Improper argument value");
68 
69  if (n == 0)
70  return 1;
71 
72  int b = 0;
73  while (n) {
74  n >>= 1;
75  ++b;
76  }
77  return b;
78 }
79 
81 inline int levels2bits(int n)
82 {
83  it_assert(n > 0, "levels2bits(): Improper argument value");
84  return int2bits(--n);
85 }
86 
91 
104 inline double trunc_log(double x)
105 {
106  if (std::numeric_limits<double>::is_iec559) {
107  if (x == std::numeric_limits<double>::infinity())
108  return log_double_max;
109  if (x <= 0)
110  return log_double_min;
111  }
112  return std::log(x);
113 }
114 
126 inline double trunc_exp(double x)
127 {
128  if (std::numeric_limits<double>::is_iec559
129  && (x >= log_double_max))
131  return std::exp(x);
132 }
133 
134 
136 ITPP_EXPORT double log_add(double log_a, double log_b);
137 
138 
139 // ----------------------------------------------------------------------
140 // functions on vectors and matrices
141 // ----------------------------------------------------------------------
142 
144 inline vec exp(const vec &x)
145 {
146  return apply_function<double>(std::exp, x);
147 }
149 inline cvec exp(const cvec &x)
150 {
151  return apply_function<std::complex<double> >(std::exp, x);
152 }
154 inline mat exp(const mat &m)
155 {
156  return apply_function<double>(std::exp, m);
157 }
159 inline cmat exp(const cmat &m)
160 {
161  return apply_function<std::complex<double> >(std::exp, m);
162 }
163 
165 inline vec pow(const double x, const vec &y)
166 {
167  return apply_function<double>(std::pow, x, y);
168 }
170 inline mat pow(const double x, const mat &y)
171 {
172  return apply_function<double>(std::pow, x, y);
173 }
175 inline vec pow(const vec &x, const double y)
176 {
177  return apply_function<double>(std::pow, x, y);
178 }
180 inline mat pow(const mat &x, const double y)
181 {
182  return apply_function<double>(std::pow, x, y);
183 }
184 
186 inline vec pow2(const vec &x)
187 {
188  return apply_function<double>(pow2, x);
189 }
191 inline mat pow2(const mat &x)
192 {
193  return apply_function<double>(pow2, x);
194 }
195 
197 inline vec pow10(const vec &x)
198 {
199  return apply_function<double>(pow10, x);
200 }
202 inline mat pow10(const mat &x)
203 {
204  return apply_function<double>(pow10, x);
205 }
206 
208 inline vec log(const vec &x)
209 {
210  return apply_function<double>(std::log, x);
211 }
213 inline mat log(const mat &x)
214 {
215  return apply_function<double>(std::log, x);
216 }
218 inline cvec log(const cvec &x)
219 {
220  return apply_function<std::complex<double> >(std::log, x);
221 }
223 inline cmat log(const cmat &x)
224 {
225  return apply_function<std::complex<double> >(std::log, x);
226 }
227 
228 // Cygwin defines log2 macro conflicting with IT++ functions
229 #if defined(log2)
230 # undef log2
231 #endif
232 
233 ITPP_EXPORT vec log2(const vec &x);
235 ITPP_EXPORT mat log2(const mat &x);
236 
238 inline vec log10(const vec &x)
239 {
240  return apply_function<double>(std::log10, x);
241 }
243 inline mat log10(const mat &x)
244 {
245  return apply_function<double>(std::log10, x);
246 }
247 
249 inline vec logb(double b, const vec &x)
250 {
251  return apply_function<double>(itpp::logb, b, x);
252 }
254 inline mat logb(double b, const mat &x)
255 {
256  return apply_function<double>(itpp::logb, b, x);
257 }
258 
260 inline vec dB(const vec &x)
261 {
262  return apply_function<double>(dB, x);
263 }
265 inline mat dB(const mat &x)
266 {
267  return apply_function<double>(dB, x);
268 }
269 
271 inline vec inv_dB(const vec &x)
272 {
273  return apply_function<double>(inv_dB, x);
274 }
276 inline mat inv_dB(const mat &x)
277 {
278  return apply_function<double>(inv_dB, x);
279 }
280 
282 inline ivec int2bits(const ivec& v)
283 {
284  return apply_function<int>(int2bits, v);
285 }
286 
288 inline ivec levels2bits(const ivec& v)
289 {
290  return apply_function<int>(levels2bits, v);
291 }
292 
294 
295 } // namespace itpp
296 
297 #endif // #ifndef LOG_EXP_H
298 
299 
300 
301 
SourceForge Logo

Generated on Sat May 25 2013 16:32:19 for IT++ by Doxygen 1.8.2