ldc/ddmd/complex.d
2016-02-20 18:46:41 +01:00

119 lines
2.1 KiB
D

// Compiler implementation of the D programming language
// Copyright (c) 1999-2015 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// http://www.digitalmars.com
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
module ddmd.complex;
struct complex_t
{
version(IN_LLVM_MSVC)
{
double re = 0;
double im = 0;
}
else
{
real re = 0;
real im = 0;
}
this(real re)
{
this.re = re;
this.im = 0;
}
this(real re, real im)
{
this.re = re;
this.im = im;
}
complex_t opAdd(complex_t y)
{
complex_t r;
r.re = re + y.re;
r.im = im + y.im;
return r;
}
complex_t opSub(complex_t y)
{
complex_t r;
r.re = re - y.re;
r.im = im - y.im;
return r;
}
complex_t opNeg()
{
complex_t r;
r.re = -re;
r.im = -im;
return r;
}
complex_t opMul(complex_t y)
{
return complex_t(re * y.re - im * y.im, im * y.re + re * y.im);
}
complex_t opMul_r(real x)
{
return complex_t(x) * this;
}
complex_t opMul(real y)
{
return this * complex_t(y);
}
complex_t opDiv(real y)
{
return this / complex_t(y);
}
complex_t opDiv(complex_t y)
{
real abs_y_re = y.re < 0 ? -y.re : y.re;
real abs_y_im = y.im < 0 ? -y.im : y.im;
real r, den;
if (abs_y_re < abs_y_im)
{
r = y.re / y.im;
den = y.im + r * y.re;
return complex_t((re * r + im) / den, (im * r - re) / den);
}
else
{
r = y.im / y.re;
den = y.re + r * y.im;
return complex_t((re + r * im) / den, (im - r * re) / den);
}
}
bool opCast(T : bool)()
{
return re || im;
}
int opEquals(complex_t y)
{
return re == y.re && im == y.im;
}
}
extern (C++) real creall(complex_t x)
{
return x.re;
}
extern (C++) real cimagl(complex_t x)
{
return x.im;
}