/** * \file * C99 Complex math cross-platform support code * * Author: * Joao Matos (joao.matos@xamarin.com) * * Copyright 2015 Xamarin, Inc (http://www.xamarin.com) * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include #include #if !defined (HAVE_COMPLEX_H) || (defined (ANDROID_UNIFIED_HEADERS) && __ANDROID_API__ < 23) #include <../../support/libm/complex.h> #else #include #endif #define _USE_MATH_DEFINES // needed by MSVC to define math constants #include #ifdef _MSC_VER #define double_complex _C_double_complex static inline double_complex mono_double_complex_make(gdouble re, gdouble im) { return _Cbuild (re, im); } static inline double_complex mono_double_complex_scalar_div(double_complex c, gdouble s) { return mono_double_complex_make(creal(c) / s, cimag(c) / s); } static inline double_complex mono_double_complex_scalar_mul(double_complex c, gdouble s) { return mono_double_complex_make(creal(c) * s, cimag(c) * s); } static inline double_complex mono_double_complex_div(double_complex left, double_complex right) { double denom = creal(right) * creal(right) + cimag(right) * cimag(right); return mono_double_complex_make( (creal(left) * creal(right) + cimag(left) * cimag(right)) / denom, (-creal(left) * cimag(right) + cimag(left) * creal(right)) / denom); } static inline double_complex mono_double_complex_sub(double_complex left, double_complex right) { return mono_double_complex_make(creal(left) - creal(right), cimag(left) - cimag(right)); } #else #define double_complex double complex static inline double_complex mono_double_complex_make(gdouble re, gdouble im) { return re + im * I; } static inline double_complex mono_double_complex_scalar_div(double_complex c, gdouble s) { return c / s; } static inline double_complex mono_double_complex_scalar_mul(double_complex c, gdouble s) { return c * s; } static inline double_complex mono_double_complex_div(double_complex left, double_complex right) { return left / right; } static inline double_complex mono_double_complex_sub(double_complex left, double_complex right) { return left - right; } #endif