1 | // -*- C++ -*- |
---|
2 | /*************************************************************************** |
---|
3 | * blitz/array/funcs.h Math functions on arrays |
---|
4 | * |
---|
5 | * $Id: funcs.h,v 1.10 2004/10/07 00:26:59 julianc Exp $ |
---|
6 | * |
---|
7 | * Copyright (C) 1997-2001 Todd Veldhuizen <tveldhui@oonumerics.org> |
---|
8 | * |
---|
9 | * This program is free software; you can redistribute it and/or |
---|
10 | * modify it under the terms of the GNU General Public License |
---|
11 | * as published by the Free Software Foundation; either version 2 |
---|
12 | * of the License, or (at your option) any later version. |
---|
13 | * |
---|
14 | * This program is distributed in the hope that it will be useful, |
---|
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
17 | * GNU General Public License for more details. |
---|
18 | * |
---|
19 | * Suggestions: blitz-dev@oonumerics.org |
---|
20 | * Bugs: blitz-bugs@oonumerics.org |
---|
21 | * |
---|
22 | * For more information, please see the Blitz++ Home Page: |
---|
23 | * http://oonumerics.org/blitz/ |
---|
24 | * |
---|
25 | ****************************************************************************/ |
---|
26 | #ifndef BZ_ARRAY_FUNCS_H |
---|
27 | #define BZ_ARRAY_FUNCS_H |
---|
28 | |
---|
29 | #include <blitz/funcs.h> |
---|
30 | #include <blitz/array/newet-macros.h> |
---|
31 | |
---|
32 | BZ_NAMESPACE(blitz) |
---|
33 | |
---|
34 | // unary functions |
---|
35 | |
---|
36 | BZ_DECLARE_ARRAY_ET_UNARY(abs, Fn_abs) |
---|
37 | BZ_DECLARE_ARRAY_ET_UNARY(acos, Fn_acos) |
---|
38 | BZ_DECLARE_ARRAY_ET_UNARY(asin, Fn_asin) |
---|
39 | BZ_DECLARE_ARRAY_ET_UNARY(atan, Fn_atan) |
---|
40 | BZ_DECLARE_ARRAY_ET_UNARY(ceil, Fn_ceil) |
---|
41 | BZ_DECLARE_ARRAY_ET_UNARY(cexp, Fn_exp) |
---|
42 | BZ_DECLARE_ARRAY_ET_UNARY(cos, Fn_cos) |
---|
43 | BZ_DECLARE_ARRAY_ET_UNARY(cosh, Fn_cosh) |
---|
44 | BZ_DECLARE_ARRAY_ET_UNARY(csqrt, Fn_sqrt) |
---|
45 | BZ_DECLARE_ARRAY_ET_UNARY(cube, Fn_cube) |
---|
46 | BZ_DECLARE_ARRAY_ET_UNARY(exp, Fn_exp) |
---|
47 | BZ_DECLARE_ARRAY_ET_UNARY(fabs, Fn_fabs) |
---|
48 | BZ_DECLARE_ARRAY_ET_UNARY(floor, Fn_floor) |
---|
49 | BZ_DECLARE_ARRAY_ET_UNARY(log, Fn_log) |
---|
50 | BZ_DECLARE_ARRAY_ET_UNARY(log10, Fn_log10) |
---|
51 | BZ_DECLARE_ARRAY_ET_UNARY(pow2, Fn_sqr) |
---|
52 | BZ_DECLARE_ARRAY_ET_UNARY(pow3, Fn_cube) |
---|
53 | BZ_DECLARE_ARRAY_ET_UNARY(pow4, Fn_pow4) |
---|
54 | BZ_DECLARE_ARRAY_ET_UNARY(pow5, Fn_pow5) |
---|
55 | BZ_DECLARE_ARRAY_ET_UNARY(pow6, Fn_pow6) |
---|
56 | BZ_DECLARE_ARRAY_ET_UNARY(pow7, Fn_pow7) |
---|
57 | BZ_DECLARE_ARRAY_ET_UNARY(pow8, Fn_pow8) |
---|
58 | BZ_DECLARE_ARRAY_ET_UNARY(sin, Fn_sin) |
---|
59 | BZ_DECLARE_ARRAY_ET_UNARY(sinh, Fn_sinh) |
---|
60 | BZ_DECLARE_ARRAY_ET_UNARY(sqr, Fn_sqr) |
---|
61 | BZ_DECLARE_ARRAY_ET_UNARY(sqrt, Fn_sqrt) |
---|
62 | BZ_DECLARE_ARRAY_ET_UNARY(tan, Fn_tan) |
---|
63 | BZ_DECLARE_ARRAY_ET_UNARY(tanh, Fn_tanh) |
---|
64 | |
---|
65 | #ifdef BZ_HAVE_COMPLEX_FCNS |
---|
66 | BZ_DECLARE_ARRAY_ET_UNARY(arg, Fn_arg) |
---|
67 | BZ_DECLARE_ARRAY_ET_UNARY(conj, Fn_conj) |
---|
68 | BZ_DECLARE_ARRAY_ET_UNARY(imag, Fn_imag) |
---|
69 | BZ_DECLARE_ARRAY_ET_UNARY(norm, Fn_norm) |
---|
70 | BZ_DECLARE_ARRAY_ET_UNARY(real, Fn_real) |
---|
71 | #endif |
---|
72 | |
---|
73 | #ifdef BZ_HAVE_IEEE_MATH |
---|
74 | // finite and trunc omitted: blitz-bugs/archive/0189.html |
---|
75 | BZ_DECLARE_ARRAY_ET_UNARY(acosh, Fn_acosh) |
---|
76 | BZ_DECLARE_ARRAY_ET_UNARY(asinh, Fn_asinh) |
---|
77 | BZ_DECLARE_ARRAY_ET_UNARY(atanh, Fn_atanh) |
---|
78 | BZ_DECLARE_ARRAY_ET_UNARY(cbrt, Fn_cbrt) |
---|
79 | BZ_DECLARE_ARRAY_ET_UNARY(erf, Fn_erf) |
---|
80 | BZ_DECLARE_ARRAY_ET_UNARY(erfc, Fn_erfc) |
---|
81 | BZ_DECLARE_ARRAY_ET_UNARY(expm1, Fn_expm1) |
---|
82 | // BZ_DECLARE_ARRAY_ET_UNARY(finite, Fn_finite) |
---|
83 | BZ_DECLARE_ARRAY_ET_UNARY(ilogb, Fn_ilogb) |
---|
84 | BZ_DECLARE_ARRAY_ET_UNARY(blitz_isnan, Fn_isnan) |
---|
85 | BZ_DECLARE_ARRAY_ET_UNARY(j0, Fn_j0) |
---|
86 | BZ_DECLARE_ARRAY_ET_UNARY(j1, Fn_j1) |
---|
87 | BZ_DECLARE_ARRAY_ET_UNARY(lgamma, Fn_lgamma) |
---|
88 | BZ_DECLARE_ARRAY_ET_UNARY(logb, Fn_logb) |
---|
89 | BZ_DECLARE_ARRAY_ET_UNARY(log1p, Fn_log1p) |
---|
90 | BZ_DECLARE_ARRAY_ET_UNARY(rint, Fn_rint) |
---|
91 | // BZ_DECLARE_ARRAY_ET_UNARY(trunc, Fn_trunc) |
---|
92 | BZ_DECLARE_ARRAY_ET_UNARY(y0, Fn_y0) |
---|
93 | BZ_DECLARE_ARRAY_ET_UNARY(y1, Fn_y1) |
---|
94 | #endif |
---|
95 | |
---|
96 | #ifdef BZ_HAVE_SYSTEM_V_MATH |
---|
97 | BZ_DECLARE_ARRAY_ET_UNARY(_class, Fn__class) |
---|
98 | BZ_DECLARE_ARRAY_ET_UNARY(itrunc, Fn_itrunc) |
---|
99 | BZ_DECLARE_ARRAY_ET_UNARY(nearest, Fn_nearest) |
---|
100 | BZ_DECLARE_ARRAY_ET_UNARY(rsqrt, Fn_rsqrt) |
---|
101 | BZ_DECLARE_ARRAY_ET_UNARY(uitrunc, Fn_uitrunc) |
---|
102 | #endif |
---|
103 | |
---|
104 | // cast() function |
---|
105 | |
---|
106 | template<typename T_cast, typename T1> |
---|
107 | _bz_inline_et |
---|
108 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_typename asExpr<T1>::T_expr, |
---|
109 | Cast<_bz_typename asExpr<T1>::T_expr::T_numtype, T_cast> > > |
---|
110 | cast(const ETBase<T1>& expr) |
---|
111 | { |
---|
112 | return _bz_ArrayExpr<_bz_ArrayExprUnaryOp< |
---|
113 | _bz_typename asExpr<T1>::T_expr, |
---|
114 | Cast<_bz_typename asExpr<T1>::T_expr::T_numtype,T_cast> > > |
---|
115 | (expr.unwrap()); |
---|
116 | } |
---|
117 | |
---|
118 | // binary functions |
---|
119 | |
---|
120 | BZ_DECLARE_ARRAY_ET_BINARY(atan2, Fn_atan2) |
---|
121 | BZ_DECLARE_ARRAY_ET_BINARY(fmod, Fn_fmod) |
---|
122 | BZ_DECLARE_ARRAY_ET_BINARY(pow, Fn_pow) |
---|
123 | |
---|
124 | #ifdef BZ_HAVE_COMPLEX_FCNS |
---|
125 | BZ_DECLARE_ARRAY_ET_BINARY(polar, Fn_polar) |
---|
126 | #endif |
---|
127 | |
---|
128 | #ifdef BZ_HAVE_SYSTEM_V_MATH |
---|
129 | BZ_DECLARE_ARRAY_ET_BINARY(copysign, Fn_copysign) |
---|
130 | BZ_DECLARE_ARRAY_ET_BINARY(drem, Fn_drem) |
---|
131 | BZ_DECLARE_ARRAY_ET_BINARY(hypot, Fn_hypot) |
---|
132 | BZ_DECLARE_ARRAY_ET_BINARY(nextafter, Fn_nextafter) |
---|
133 | BZ_DECLARE_ARRAY_ET_BINARY(remainder, Fn_remainder) |
---|
134 | BZ_DECLARE_ARRAY_ET_BINARY(scalb, Fn_scalb) |
---|
135 | BZ_DECLARE_ARRAY_ET_BINARY(unordered, Fn_unordered) |
---|
136 | #endif |
---|
137 | |
---|
138 | #ifdef BZ_HAVE_SYSTEM_V_MATH |
---|
139 | |
---|
140 | #define BZ_DECLARE_ARRAY_ET_SCALAR_FUNCS(sca) \ |
---|
141 | \ |
---|
142 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(atan2, Fn_atan2, sca) \ |
---|
143 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(fmod, Fn_fmod, sca) \ |
---|
144 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(pow, Fn_pow, sca) \ |
---|
145 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(copysign, Fn_copysign, sca) \ |
---|
146 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(drem, Fn_drem, sca) \ |
---|
147 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(hypot, Fn_hypot, sca) \ |
---|
148 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(nextafter, Fn_nextafter, sca) \ |
---|
149 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(remainder, Fn_remainder, sca) \ |
---|
150 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(scalb, Fn_scalb, sca) \ |
---|
151 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(unordered, Fn_unordered, sca) \ |
---|
152 | |
---|
153 | #else |
---|
154 | |
---|
155 | #define BZ_DECLARE_ARRAY_ET_SCALAR_FUNCS(sca) \ |
---|
156 | \ |
---|
157 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(atan2, Fn_atan2, sca) \ |
---|
158 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(fmod, Fn_fmod, sca) \ |
---|
159 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(pow, Fn_pow, sca) \ |
---|
160 | |
---|
161 | #endif |
---|
162 | |
---|
163 | BZ_DECLARE_ARRAY_ET_SCALAR_FUNCS(int) |
---|
164 | BZ_DECLARE_ARRAY_ET_SCALAR_FUNCS(float) |
---|
165 | BZ_DECLARE_ARRAY_ET_SCALAR_FUNCS(double) |
---|
166 | BZ_DECLARE_ARRAY_ET_SCALAR_FUNCS(long double) |
---|
167 | |
---|
168 | #ifdef BZ_HAVE_COMPLEX_FCNS |
---|
169 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(polar, Fn_polar, int) |
---|
170 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(polar, Fn_polar, float) |
---|
171 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(polar, Fn_polar, double) |
---|
172 | BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(polar, Fn_polar, long double) |
---|
173 | |
---|
174 | template<typename T1, typename T2> |
---|
175 | inline _bz_ArrayExprBinaryOp< |
---|
176 | typename asExpr<complex<T1> >::T_expr, |
---|
177 | typename asExpr<T2>::T_expr, |
---|
178 | Fn_pow<complex<T1>,typename asExpr<T2>::T_expr::T_numtype> > |
---|
179 | pow(const complex<T1> d1, const ETBase<T2>& d2) |
---|
180 | { |
---|
181 | return _bz_ArrayExprBinaryOp< |
---|
182 | typename asExpr<complex<T1> >::T_expr, |
---|
183 | typename asExpr<T2>::T_expr, |
---|
184 | Fn_pow<complex<T1>,typename asExpr<T2>::T_expr::T_numtype> > |
---|
185 | (asExpr<complex<T1> >::getExpr(d1), |
---|
186 | asExpr<T2>::getExpr(d2.unwrap())); |
---|
187 | } |
---|
188 | |
---|
189 | #endif |
---|
190 | |
---|
191 | BZ_NAMESPACE_END |
---|
192 | |
---|
193 | #endif // BZ_ARRAY_FUNCS_H |
---|