22#include "quest/include/config.h"
23#include "quest/include/precision.h"
45 typedef std::complex<FLOAT_TYPE> qcomp;
56 #if (QUEST_FLOAT_PRECISION == 1)
57 typedef _Fcomplex qcomp;
59 #elif (QUEST_FLOAT_PRECISION == 2)
60 typedef _Dcomplex qcomp;
62 #elif (QUEST_FLOAT_PRECISION == 4)
63 typedef _Lcomplex qcomp;
91static inline qcomp
getQcomp(qreal re, qreal im) {
93 #if defined(__cplusplus)
96 #elif defined(_MSC_VER)
97 return (qcomp) {re, im};
119 using namespace std::complex_literals;
127 static inline qcomp
operator ""_i(
long double y) {
128 return qcomp(0,
static_cast<qreal
>(y));
131 static inline qcomp
operator ""_i(
unsigned long long int y) {
132 return qcomp(0,
static_cast<qreal
>(y));
169 #define COMP_TO_QCOMP(a) \
171 static_cast<qreal>(std::real(a)), \
172 static_cast<qreal>(std::imag(a)))
174 #define REAL_TO_QCOMP(b) \
175 qcomp(static_cast<qreal>(b), 0)
178 #define DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(op, compprec, realtype) \
179 static inline qcomp operator op (const std::complex<compprec>& a, const realtype& b) { \
185 static inline qcomp operator op (const realtype& b, const std::complex<compprec>& a) { \
191 static inline std::complex<compprec>& operator op##= (std::complex<compprec>& a, const realtype& b) { \
197 #define DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, realtype) \
198 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(+, compprec, realtype) \
199 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(-, compprec, realtype) \
200 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(*, compprec, realtype) \
201 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(/, compprec, realtype)
204 #define DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(compprec) \
205 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, int) \
206 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long int) \
207 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long long int) \
208 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, unsigned) \
209 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long unsigned) \
210 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long long unsigned)
213 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(
float)
214 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(
double)
215 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(
long double)
218 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
float,
double)
219 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
float,
long double)
220 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
double,
long double)
221 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
double,
float)
222 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
long double,
float)
223 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
long double,
double)
226 #define DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(op, precA, precB) \
227 static inline qcomp operator op (const std::complex<precA>& a, const std::complex<precB>& b) { \
235 #define DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precA, precB) \
236 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(+, precA, precB) \
237 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(-, precA, precB) \
238 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(*, precA, precB) \
239 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(/, precA, precB)
241 #define DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precA, precB) \
242 DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precA, precB) \
243 DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precB, precA)
246 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(
float,
double)
247 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(
float,
long double)
248 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(
double,
long double)
253 #undef DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL
254 #undef DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX
255 #undef DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL
256 #undef DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER
257 #undef DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX
258 #undef DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX
282 extern "C" void reportStr(
const char* str);
294 extern "C" void reportScalar(
const char* label, qcomp num);
327 void _reportScalar_real(
const char* label, qreal num);
332 #define reportScalar(label, num) \
334 qcomp : reportScalar, \
335 qreal : _reportScalar_real, \
336 default : _reportScalar_real \
void reportStr(const char *str)
static qcomp getQcomp(qreal re, qreal im)
void reportScalar(const char *label, qcomp num)