1 1.1 mrg 2 1.1 mrg /* Compiler implementation of the D programming language 3 1.1 mrg * Copyright (C) 1999-2022 by The D Language Foundation, All Rights Reserved 4 1.1 mrg * written by Walter Bright 5 1.1 mrg * https://www.digitalmars.com 6 1.1 mrg * Distributed under the Boost Software License, Version 1.0. 7 1.1 mrg * https://www.boost.org/LICENSE_1_0.txt 8 1.1 mrg * https://github.com/dlang/dmd/blob/master/src/dmd/root/complex_t.h 9 1.1 mrg */ 10 1.1 mrg 11 1.1 mrg #pragma once 12 1.1 mrg 13 1.1 mrg #include "ctfloat.h" 14 1.1 mrg 15 1.1 mrg /* Roll our own complex type for compilers that don't support complex 16 1.1 mrg */ 17 1.1 mrg 18 1.1 mrg struct complex_t 19 1.1 mrg { 20 1.1 mrg real_t re; 21 1.1 mrg real_t im; 22 1.1 mrg 23 1.1 mrg complex_t(real_t re) : re(re), im(CTFloat::zero) {} 24 1.1 mrg complex_t(real_t re, real_t im) : re(re), im(im) {} 25 1.1 mrg 26 1.1 mrg complex_t operator + (complex_t y) { return complex_t(re + y.re, im + y.im); } 27 1.1 mrg complex_t operator - (complex_t y) { return complex_t(re - y.re, im - y.im); } 28 1.1 mrg complex_t operator - () { return complex_t(-re, -im); } 29 1.1 mrg complex_t operator * (complex_t y) { return complex_t(re * y.re - im * y.im, im * y.re + re * y.im); } 30 1.1 mrg 31 1.1 mrg complex_t operator / (complex_t y) 32 1.1 mrg { 33 1.1 mrg if (CTFloat::fabs(y.re) < CTFloat::fabs(y.im)) 34 1.1 mrg { 35 1.1 mrg real_t r = y.re / y.im; 36 1.1 mrg real_t den = y.im + r * y.re; 37 1.1 mrg return complex_t((re * r + im) / den, 38 1.1 mrg (im * r - re) / den); 39 1.1 mrg } 40 1.1 mrg else 41 1.1 mrg { 42 1.1 mrg real_t r = y.im / y.re; 43 1.1 mrg real_t den = y.re + r * y.im; 44 1.1 mrg return complex_t((re + r * im) / den, 45 1.1 mrg (im - r * re) / den); 46 1.1 mrg } 47 1.1 mrg } 48 1.1 mrg 49 1.1 mrg operator bool () { return re || im; } 50 1.1 mrg 51 1.1 mrg int operator == (complex_t y) { return re == y.re && im == y.im; } 52 1.1 mrg int operator != (complex_t y) { return re != y.re || im != y.im; } 53 1.1 mrg 54 1.1 mrg private: 55 1.1 mrg complex_t() : re(CTFloat::zero), im(CTFloat::zero) {} 56 1.1 mrg }; 57 1.1 mrg 58 1.1 mrg inline complex_t operator * (real_t x, complex_t y) { return complex_t(x) * y; } 59 1.1 mrg inline complex_t operator * (complex_t x, real_t y) { return x * complex_t(y); } 60 1.1 mrg inline complex_t operator / (complex_t x, real_t y) { return x / complex_t(y); } 61 1.1 mrg 62 1.1 mrg 63 1.1 mrg inline real_t creall(complex_t x) 64 1.1 mrg { 65 1.1 mrg return x.re; 66 1.1 mrg } 67 1.1 mrg 68 1.1 mrg inline real_t cimagl(complex_t x) 69 1.1 mrg { 70 1.1 mrg return x.im; 71 1.1 mrg } 72