Home | History | Annotate | Line # | Download | only in root
      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