mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-07 11:26:02 +03:00
119 lines
2.1 KiB
D
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;
|
|
}
|