C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk_complex_adaptor.hpp
Go to the documentation of this file.
1/*
2 **************************************************************
3 * C++ Mathematical Expression Toolkit Library *
4 * *
5 * Custom Complex type Adaptor *
6 * Author: Arash Partow (1999-2024) *
7 * URL: https://www.partow.net/programming/exprtk/index.html *
8 * *
9 * Copyright notice: *
10 * Free use of the Mathematical Expression Toolkit Library is *
11 * permitted under the guidelines and in accordance with the *
12 * most current version of the MIT License. *
13 * https://www.opensource.org/licenses/MIT *
14 * SPDX-License-Identifier: MIT *
15 * *
16 **************************************************************
17*/
18
19
20#ifndef EXPRTK_COMPLEX_ADAPTOR_HPP
21#define EXPRTK_COMPLEX_ADAPTOR_HPP
22
23
24#include <string>
25#include "complex_type.hpp"
26
27
28namespace exprtk
29{
30 namespace details
31 {
32 namespace numeric { namespace details
33 {
34 struct complex_type_tag;
35
36 template <typename T> inline T const_pi_impl(complex_type_tag);
37 template <typename T> inline T const_e_impl (complex_type_tag);
38 }}
39
40 inline bool is_true (const cmplx::complex_t& v);
41 inline bool is_false(const cmplx::complex_t& v);
42
43 template <typename Iterator>
44 inline bool string_to_real(Iterator& itr_external, const Iterator end, cmplx::complex_t& t, details::numeric::details::complex_type_tag);
45 }
46
47 namespace rtl { namespace io
48 {
49 namespace details
50 {
52 }
53 }}
54
55 using details::is_true;
56}
57
58#include "exprtk.hpp"
59
60namespace exprtk
61{
62 namespace details
63 {
64 namespace numeric
65 {
66 namespace details
67 {
70
71 template<> struct number_type<cmplx::complex_t> { typedef complex_type_tag type; };
72
73 template <>
75 {
76 static inline cmplx::complex_t value()
77 {
78 const cmplx::complex_t epsilon = cmplx::complex_t(0.000000000001);
79 return epsilon;
80 }
81 };
82
84 {
85 return std::isnan(v.c_.real()) || std::isnan(v.c_.imag()) ;
86 }
87
88 template <typename T> inline T abs_impl(const T v, complex_type_tag) { return cmplx::abs (v); }
89 template <typename T> inline T acos_impl(const T v, complex_type_tag) { return cmplx::acos (v); }
90 template <typename T> inline T acosh_impl(const T v, complex_type_tag) { return cmplx::log(v + cmplx::sqrt((v * v) - cmplx::complex_t(1))); }
91 template <typename T> inline T asin_impl(const T v, complex_type_tag) { return cmplx::asin (v); }
92 template <typename T> inline T asinh_impl(const T v, complex_type_tag) { return cmplx::log(v + cmplx::sqrt((v * v) + cmplx::complex_t(1))); }
93 template <typename T> inline T atan_impl(const T v, complex_type_tag) { return cmplx::atan (v); }
94 template <typename T> inline T atanh_impl(const T v, complex_type_tag) { return (cmplx::log(cmplx::complex_t(1) + v) - log(cmplx::complex_t(1) - v)) / cmplx::complex_t(2); }
95 template <typename T> inline T ceil_impl(const T v, complex_type_tag) { return cmplx::ceil (v); }
96 template <typename T> inline T cos_impl(const T v, complex_type_tag) { return cmplx::cos (v); }
97 template <typename T> inline T cosh_impl(const T v, complex_type_tag) { return cmplx::cosh (v); }
98 template <typename T> inline T exp_impl(const T v, complex_type_tag) { return cmplx::exp (v); }
99 template <typename T> inline T floor_impl(const T v, complex_type_tag) { return cmplx::floor(v); }
100 template <typename T> inline T log_impl(const T v, complex_type_tag) { return cmplx::log (v); }
101 template <typename T> inline T log10_impl(const T v, complex_type_tag) { return cmplx::log10(v); }
102 template <typename T> inline T log2_impl(const T v, complex_type_tag) { return cmplx::log(v)/cmplx::complex_t(constant::log2); }
103 template <typename T> inline T neg_impl(const T v, complex_type_tag) { return -v; }
104 template <typename T> inline T pos_impl(const T v, complex_type_tag) { return v; }
105 template <typename T> inline T sin_impl(const T v, complex_type_tag) { return cmplx::sin (v); }
106 template <typename T> inline T sinh_impl(const T v, complex_type_tag) { return cmplx::sinh (v); }
107 template <typename T> inline T sqrt_impl(const T v, complex_type_tag) { return cmplx::sqrt (v); }
108 template <typename T> inline T tan_impl(const T v, complex_type_tag) { return cmplx::tan (v); }
109 template <typename T> inline T tanh_impl(const T v, complex_type_tag) { return cmplx::tanh (v); }
110 template <typename T> inline T cot_impl(const T v, complex_type_tag) { return cmplx::complex_t(1) / cmplx::tan(v); }
111 template <typename T> inline T sec_impl(const T v, complex_type_tag) { return cmplx::complex_t(1) / cmplx::cos(v); }
112 template <typename T> inline T csc_impl(const T v, complex_type_tag) { return cmplx::complex_t(1) / cmplx::sin(v); }
113 template <typename T> inline T r2d_impl(const T v, complex_type_tag) { return (v * cmplx::complex_t(constant::_180_pi)); }
114 template <typename T> inline T d2r_impl(const T v, complex_type_tag) { return (v * cmplx::complex_t(constant::pi_180)); }
115 template <typename T> inline T d2g_impl(const T v, complex_type_tag) { return (v * cmplx::complex_t(20.0/9.0)); }
116 template <typename T> inline T g2d_impl(const T v, complex_type_tag) { return (v * cmplx::complex_t(9.0/20.0)); }
117 template <typename T> inline T notl_impl(const T v, complex_type_tag) { return (v != cmplx::complex_t(0) ? cmplx::complex_t(0) : cmplx::complex_t(1)); }
118 template <typename T> inline T frac_impl(const T v, complex_type_tag) { return cmplx::frac(v); }
119 template <typename T> inline T trunc_impl(const T v, complex_type_tag) { return cmplx::trunc(v); }
120
121 template <typename T> inline T const_pi_impl(complex_type_tag) { return cmplx::details::constant::pi; }
122 template <typename T> inline T const_e_impl (complex_type_tag) { return cmplx::details::constant::e; }
123
124 template <typename T>
125 inline int to_int32_impl(const T v, complex_type_tag)
126 {
127 return static_cast<int>(v);
128 }
129
130 template <typename T>
131 inline long long to_int64_impl(const T v, complex_type_tag)
132 {
133 return static_cast<long long int>(v);
134 }
135
136 template <typename T>
137 inline unsigned long long to_uint64_impl(const T v, complex_type_tag)
138 {
139 return static_cast<unsigned long long int>(v);
140 }
141
142 inline bool is_true_impl (const cmplx::complex_t v)
143 {
144 return (0.0 != v);
145 }
146
147 inline bool is_false_impl(const cmplx::complex_t v)
148 {
149 return (0.0 == v);
150 }
151
152 template <typename T>
154 {
155 if (abs(v) < T(0.00001))
156 return v + (T(0.5) * v * v);
157 else
158 return exp(v) - T(1);
159 }
160
161 template <typename T>
162 inline T nequal_impl(const T v0, const T v1, complex_type_tag)
163 {
164 const T epsilon = epsilon_type<T>::value();
165 const T eps_norm = (std::max(T(1),std::max(abs_impl(v0,complex_type_tag()),abs_impl(v1,complex_type_tag()))) * epsilon);
166 return (abs_impl(v0 - v1,complex_type_tag()) > eps_norm) ? T(1) : T(0);
167 }
168
169 template <typename T>
170 inline T sgn_impl(const T v, complex_type_tag)
171 {
172 if (v > T(0)) return T(+1);
173 else if (v < T(0)) return T(-1);
174 else return T( 0);
175 }
176
177 template <typename T>
179 {
180 if (v > T(-1))
181 {
182 if (abs_impl(v,complex_type_tag()) > T(0.0001))
183 {
184 return log_impl(T(1) + v,complex_type_tag());
185 }
186 else
187 return (T(-0.5) * v + T(1)) * v;
188 }
189 else
190 return T(std::numeric_limits<T>::quiet_NaN());
191 }
192
193 template <typename T>
195 {
196 const T t = T(1) / (T(1) + T(0.5) * abs_impl(v,complex_type_tag()));
197
198 static const T c[] = {
199 T( 1.26551223), T(1.00002368),
200 T( 0.37409196), T(0.09678418),
201 T(-0.18628806), T(0.27886807),
202 T(-1.13520398), T(1.48851587),
203 T(-0.82215223), T(0.17087277)
204 };
205
206 T result = T(1) - t * exp_impl((-v * v) -
207 c[0] + t * (c[1] + t *
208 (c[2] + t * (c[3] + t *
209 (c[4] + t * (c[5] + t *
210 (c[6] + t * (c[7] + t *
211 (c[8] + t * (c[9]))))))))),complex_type_tag());
212
213 return (v >= T(0)) ? result : -result;
214 }
215
216 template <typename T>
218 {
219 return T(1) - erf_impl(v,complex_type_tag());
220 }
221
222 template <typename T>
224 {
225 T cnd = T(0.5) * (T(1) + erf_impl(
228 return (v < T(0)) ? (T(1) - cnd) : cnd;
229 }
230
231 template <typename T>
232 inline T modulus_impl(const T v0, const T v1, complex_type_tag)
233 {
234 return modulus(v0,v1);
235 }
236
237 template <typename T>
238 inline T pow_impl(const T v0, const T v1, complex_type_tag)
239 {
240 return cmplx::pow(v0,v1);
241 }
242
243 template <typename T>
244 inline T logn_impl(const T v0, const T v1, complex_type_tag)
245 {
246 return log(v0) / log(v1);
247 }
248
249 template <typename T>
251 {
252 if (abs_impl(v,complex_type_tag()) >= std::numeric_limits<T>::epsilon())
253 return(sin_impl(v,complex_type_tag()) / v);
254 else
255 return T(1);
256 }
257
258 template <typename T>
259 inline T xor_impl(const T v0, const T v1, complex_type_tag)
260 {
261 return (is_false_impl(v0) != is_false_impl(v1)) ? T(1) : T(0);
262 }
263
264 template <typename T>
265 inline T xnor_impl(const T v0, const T v1, complex_type_tag)
266 {
267 const bool v0_true = is_true_impl(v0);
268 const bool v1_true = is_true_impl(v1);
269 if ((v0_true && v1_true) || (!v0_true && !v1_true))
270 return T(1);
271 else
272 return T(0);
273 }
274
275 template <typename T>
276 inline T equal_impl(const T v0, const T v1, complex_type_tag)
277 {
278 const T epsilon = epsilon_type<T>::value();
279 const T eps_norm = (max(T(1),max(abs_impl(v0,complex_type_tag()),abs_impl(v1,complex_type_tag()))) * epsilon);
280 return (abs_impl(v0 - v1,complex_type_tag()) <= eps_norm) ? T(1) : T(0);
281 }
282
283 template <typename T>
285 {
286 return ((v < T(0)) ? ceil(v - T(0.5)) : floor(v + T(0.5)));
287 }
288
289 template <typename T>
290 inline T roundn_impl(const T v0, const T v1, complex_type_tag)
291 {
292 const int index = std::max<int>(0, std::min<int>(pow10_size - 1, (int)floor(v1)));
293 const T p10 = T(pow10[index]);
294 if (v0 < T(0))
295 return T(ceil ((v0 * p10) - T(0.5)) / p10);
296 else
297 return T(floor((v0 * p10) + T(0.5)) / p10);
298 }
299
300 template <typename T>
301 inline bool is_integer_impl(const T v, complex_type_tag)
302 {
303 return (T(0) == modulus_impl(v,T(1),complex_type_tag()));
304 }
305
306 template <typename T>
307 inline T root_impl(const T v0, const T v1, complex_type_tag)
308 {
309 return pow(v0,T(1) / v1);
310 }
311
312 template <typename T>
313 inline T hypot_impl(const T v0, const T v1, complex_type_tag)
314 {
315 return sqrt((v0 * v0) + (v1 * v1));
316 }
317
318 template <typename T>
319 inline T atan2_impl(const T v0, const T v1, complex_type_tag)
320 {
321 return cmplx::atan2(v0,v1);
322 }
323
324 template <typename T>
325 inline T shr_impl(const T v0, const T v1, complex_type_tag)
326 {
327 return v0 * (T(1) / pow(T(2),v1));
328 }
329
330 template <typename T>
331 inline T shl_impl(const T v0, const T v1, complex_type_tag)
332 {
333 return v0 * pow(T(2),v1);
334 }
335
336 template <typename T>
337 inline T and_impl(const T v0, const T v1, complex_type_tag)
338 {
339 return (is_true_impl(v0) && is_true_impl(v1)) ? T(1) : T(0);
340 }
341
342 template <typename T>
343 inline T nand_impl(const T v0, const T v1, complex_type_tag)
344 {
345 return (is_false_impl(v0) || is_false_impl(v1)) ? T(1) : T(0);
346 }
347
348 template <typename T>
349 inline T or_impl(const T v0, const T v1, complex_type_tag)
350 {
351 return (is_true_impl(v0) || is_true_impl(v1)) ? T(1) : T(0);
352 }
353
354 template <typename T>
355 inline T nor_impl(const T v0, const T v1, complex_type_tag)
356 {
357 return (is_false_impl(v0) && is_false_impl(v1)) ? T(1) : T(0);
358 }
359 }
360 }
361
362 template <typename Iterator>
366 {
368 double real_component;
369 const bool result = string_to_real<Iterator,double>(itr_external,end,real_component,num_type);
370 t.c_.real(real_component);
371 return result;
372 }
373
374 inline bool is_true (const cmplx::complex_t& v) { return cmplx::is_true(v); }
375 inline bool is_false(const cmplx::complex_t& v) { return cmplx::is_false(v); }
376 }
377
378 namespace rtl { namespace io
379 {
380 namespace details
381 {
383 {
384 printf(fmt.c_str(),(double)v.c_.real(), (double)v.c_.imag());
385 }
386 }
387 }}
388}
389
390#endif
static const complex_t e
static const complex_t pi
complex_t log(const complex_t v)
complex_t cosh(const complex_t v)
complex_t floor(const complex_t v)
complex_t sinh(const complex_t v)
complex_t abs(const complex_t v)
complex_t asin(const complex_t v)
complex_t tanh(const complex_t v)
complex_t tan(const complex_t v)
complex_t frac(const complex_t v)
complex_t trunc(const complex_t v)
complex_t atan2(const complex_t v0, const complex_t v1)
complex_t exp(const complex_t v)
complex_t sin(const complex_t v)
complex_t atan(const complex_t v)
complex_t ceil(const complex_t v)
complex_t sqrt(const complex_t v)
complex_t acos(const complex_t v)
bool is_false(const complex_t v)
bool is_true(const complex_t v)
complex_t log10(const complex_t v)
complex_t pow(const complex_t v0, const complex_t v1)
complex_t cos(const complex_t v)
static const double _180_pi
Definition exprtk.hpp:819
float erf_impl(const float v)
Definition exprtk.hpp:1247
bool is_nan_impl(const T v, real_type_tag)
Definition exprtk.hpp:879
T floor_impl(const T v, real_type_tag)
Definition exprtk.hpp:1386
T ceil_impl(const T v, real_type_tag)
Definition exprtk.hpp:1382
T shr_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1120
T tanh_impl(const T v, real_type_tag)
Definition exprtk.hpp:1396
T acosh_impl(const T v, real_type_tag)
Definition exprtk.hpp:1361
T nor_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1196
bool is_integer_impl(const T &v, real_type_tag)
Definition exprtk.hpp:1443
T sinc_impl(const T v, real_type_tag)
Definition exprtk.hpp:1327
T asin_impl(const T v, real_type_tag)
Definition exprtk.hpp:1380
T log10_impl(const T v, real_type_tag)
Definition exprtk.hpp:1388
T r2d_impl(const T v, real_type_tag)
Definition exprtk.hpp:1400
T shl_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1132
T logn_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1013
T sqrt_impl(const T v, real_type_tag)
Definition exprtk.hpp:1394
T xnor_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1220
T asinh_impl(const T v, real_type_tag)
Definition exprtk.hpp:1367
float erfc_impl(const float v)
Definition exprtk.hpp:1292
T d2r_impl(const T v, real_type_tag)
Definition exprtk.hpp:1401
T neg_impl(const T v, real_type_tag)
Definition exprtk.hpp:1390
T root_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1052
T and_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1160
T pos_impl(const T v, real_type_tag)
Definition exprtk.hpp:1391
T log_impl(const T v, real_type_tag)
Definition exprtk.hpp:1387
_uint64_t to_uint64_impl(const T v, real_type_tag)
Definition exprtk.hpp:897
T ncdf_impl(const T v, real_type_tag)
Definition exprtk.hpp:1315
T csc_impl(const T v, real_type_tag)
Definition exprtk.hpp:1399
_int64_t to_int64_impl(const T v, real_type_tag)
Definition exprtk.hpp:891
T log2_impl(const T v, real_type_tag)
Definition exprtk.hpp:1389
T cot_impl(const T v, real_type_tag)
Definition exprtk.hpp:1397
T or_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1184
T cos_impl(const T v, real_type_tag)
Definition exprtk.hpp:1383
T sinh_impl(const T v, real_type_tag)
Definition exprtk.hpp:1393
T roundn_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1078
T sec_impl(const T v, real_type_tag)
Definition exprtk.hpp:1398
T atan2_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1108
T pow_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1001
T modulus_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:989
T log1p_impl(const T v, real_type_tag)
Definition exprtk.hpp:1025
T trunc_impl(const T v, real_type_tag)
Definition exprtk.hpp:1406
T frac_impl(const T v, real_type_tag)
Definition exprtk.hpp:1405
T hypot_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1096
T nand_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1172
T equal_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:933
T nequal_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:968
T g2d_impl(const T v, real_type_tag)
Definition exprtk.hpp:1403
T exp_impl(const T v, real_type_tag)
Definition exprtk.hpp:1385
T sin_impl(const T v, real_type_tag)
Definition exprtk.hpp:1392
T round_impl(const T v, real_type_tag)
Definition exprtk.hpp:1072
T abs_impl(const T v, real_type_tag)
Definition exprtk.hpp:915
T sgn_impl(const T v, real_type_tag)
Definition exprtk.hpp:1144
T d2g_impl(const T v, real_type_tag)
Definition exprtk.hpp:1402
T acos_impl(const T v, real_type_tag)
Definition exprtk.hpp:1379
T tan_impl(const T v, real_type_tag)
Definition exprtk.hpp:1395
T xor_impl(const T v0, const T v1, real_type_tag)
Definition exprtk.hpp:1208
T expm1_impl(const T v, real_type_tag)
Definition exprtk.hpp:952
int to_int32_impl(const T v, real_type_tag)
Definition exprtk.hpp:885
T atanh_impl(const T v, real_type_tag)
Definition exprtk.hpp:1373
T atan_impl(const T v, real_type_tag)
Definition exprtk.hpp:1381
T notl_impl(const T v, real_type_tag)
Definition exprtk.hpp:1404
T cosh_impl(const T v, real_type_tag)
Definition exprtk.hpp:1384
T pow(const T v0, const T v1)
Definition exprtk.hpp:1527
T modulus(const T v0, const T v1)
Definition exprtk.hpp:1520
T max(const T v0, const T v1)
Definition exprtk.hpp:1499
bool is_true(const double v)
Definition exprtk.hpp:5615
static const double pow10[]
Definition exprtk.hpp:797
bool string_to_real(Iterator &itr_external, const Iterator end, T &t, numeric::details::real_type_tag)
Definition exprtk.hpp:1932
bool is_false(const expression_node< T > *node)
Definition exprtk.hpp:5643
bool match_impl(const Iterator pattern_begin, const Iterator pattern_end, const Iterator data_begin, const Iterator data_end, const typename std::iterator_traits< Iterator >::value_type &zero_or_more, const typename std::iterator_traits< Iterator >::value_type &exactly_one)
Definition exprtk.hpp:598
static const std::size_t pow10_size
Definition exprtk.hpp:806
void print_type(const std::string &fmt, const T v, exprtk::details::numeric::details::real_type_tag)
Definition exprtk.hpp:43547
std::complex< double > c_