Advertisement
Whiplash141

Whip's Complex Number Struct

Sep 26th, 2017
515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.39 KB | None | 0 0
  1. public struct ComplexNumber
  2. {
  3.     public readonly double Real;
  4.     public readonly double Imaginary;
  5.     private const double epsilon = 1e-9;
  6.  
  7.     public ComplexNumber(double real, double imaginary)
  8.     {
  9.         Real = real;
  10.         Imaginary = imaginary;
  11.     }
  12.  
  13.     #region Addition
  14.     public static ComplexNumber operator +(ComplexNumber s1, double num)
  15.     {
  16.         return new ComplexNumber(s1.Real + num, s1.Imaginary);
  17.     }
  18.  
  19.     public static ComplexNumber operator +(double num, ComplexNumber s1)
  20.     {
  21.         return new ComplexNumber(s1.Real + num, s1.Imaginary);
  22.     }
  23.  
  24.     public static ComplexNumber operator +(ComplexNumber s1, ComplexNumber s2)
  25.     {
  26.         return new ComplexNumber(s1.Real + s2.Real, s1.Imaginary + s2.Imaginary);
  27.     }
  28.     #endregion
  29.  
  30.     #region Subtraction
  31.     public static ComplexNumber operator -(ComplexNumber s1, double num)
  32.     {
  33.         return new ComplexNumber(s1.Real - num, s1.Imaginary);
  34.     }
  35.  
  36.     public static ComplexNumber operator -(double num, ComplexNumber s1)
  37.     {
  38.         return new ComplexNumber(num - s1.Real, s1.Imaginary);
  39.     }
  40.  
  41.     public static ComplexNumber operator -(ComplexNumber s1, ComplexNumber s2)
  42.     {
  43.         return new ComplexNumber(s1.Real - s2.Real, s1.Imaginary - s2.Imaginary);
  44.     }
  45.     #endregion
  46.  
  47.     #region Multiplacation
  48.     public static ComplexNumber operator *(ComplexNumber s1, ComplexNumber s2)
  49.     {
  50.         return new ComplexNumber(s1.Real * s2.Real - s1.Imaginary * s2.Imaginary, s1.Imaginary * s2.Real + s1.Real * s2.Imaginary);
  51.     }
  52.  
  53.     public static ComplexNumber operator *(double num, ComplexNumber s1)
  54.     {
  55.         return new ComplexNumber(num * s1.Real, num * s1.Imaginary);
  56.     }
  57.  
  58.     public static ComplexNumber operator *(ComplexNumber s1, double num)
  59.     {
  60.         return new ComplexNumber(num * s1.Real, num * s1.Imaginary);
  61.     }
  62.     #endregion
  63.  
  64.     #region Division
  65.     public static ComplexNumber operator /(ComplexNumber s1, ComplexNumber s2)
  66.     {
  67.         ComplexNumber numerator = s1 * s2.Conjugate();
  68.         ComplexNumber demominator = s2 * s2.Conjugate(); //this will be real
  69.         return new ComplexNumber(numerator.Real / demominator.Real, numerator.Imaginary / demominator.Real);
  70.     }
  71.  
  72.     public static ComplexNumber operator /(double num, ComplexNumber s1)
  73.     {
  74.         ComplexNumber numerator = num * s1.Conjugate();
  75.         ComplexNumber demominator = s1 * s1.Conjugate(); //this will be real
  76.         return new ComplexNumber(numerator.Real / demominator.Real, numerator.Imaginary / demominator.Real);
  77.     }
  78.  
  79.     public static ComplexNumber operator /(ComplexNumber s1, double num)
  80.     {
  81.         return new ComplexNumber(s1.Real / num, s1.Imaginary / num);
  82.     }
  83.     #endregion
  84.  
  85.     #region Equality
  86.     public override bool Equals(Object s1)
  87.     {
  88.         return s1 is ComplexNumber && (ComplexNumber)s1 == new ComplexNumber(Real, Imaginary);
  89.     }
  90.  
  91.     public override int GetHashCode()
  92.     {
  93.         return Real.GetHashCode() ^ Imaginary.GetHashCode();
  94.     }
  95.  
  96.     public static bool operator ==(ComplexNumber s1, ComplexNumber s2)
  97.     {
  98.         return Math.Abs(s1.Real - s2.Real) < epsilon && Math.Abs(s1.Imaginary - s2.Imaginary) < epsilon;
  99.     }
  100.  
  101.     public static bool operator !=(ComplexNumber s1, ComplexNumber s2)
  102.     {
  103.         return Math.Abs(s1.Real - s2.Real) > epsilon || Math.Abs(s1.Imaginary - s2.Imaginary) > epsilon;
  104.     }
  105.     #endregion
  106.  
  107.     #region Complex Number Properties
  108.     public ComplexNumber Conjugate()
  109.     {
  110.         return new ComplexNumber(Real, -Imaginary);
  111.     }
  112.  
  113.     public double Angle()
  114.     {
  115.         return Math.Atan2(Imaginary, Real);
  116.     }
  117.  
  118.     public double Magnitude()
  119.     {
  120.         return Math.Sqrt(Real * Real + Imaginary * Imaginary);
  121.     }
  122.     #endregion
  123.  
  124.     #region Booleans
  125.     public bool IsReal()
  126.     {
  127.         return Math.Abs(Imaginary) < epsilon;
  128.     }
  129.  
  130.     public bool IsImaginary()
  131.     {
  132.         return Math.Abs(Imaginary) > epsilon && Math.Abs(Real) < epsilon;
  133.     }
  134.  
  135.     public bool IsComplex()
  136.     {
  137.         return Math.Abs(Imaginary) > epsilon && Math.Abs(Real) > epsilon;
  138.     }
  139.     #endregion
  140.  
  141.     #region Exponents
  142.     public static ComplexNumber Pow(ComplexNumber s1, double num)
  143.     {
  144.         double magnitude = s1.Magnitude();
  145.         double angle = s1.Angle();
  146.         return Math.Pow(magnitude, num) * new ComplexNumber(Math.Cos(num * angle), Math.Sin(num * angle));
  147.     }
  148.  
  149.     public static ComplexNumber Pow(ComplexNumber s1, int num)
  150.     {
  151.         var result = new ComplexNumber(1, 0);
  152.  
  153.         if (num == 0)
  154.             return result;
  155.  
  156.         if (num < 0)
  157.         {
  158.             for (int i = 1; i <= -num; i++)
  159.             {
  160.                 result = result * s1;
  161.             }
  162.  
  163.             return 1 / result;
  164.         }
  165.  
  166.         for (int i = 1; i <= num; i++)
  167.         {
  168.             result = result * s1;
  169.         }
  170.  
  171.         return result;
  172.     }
  173.  
  174.     public static ComplexNumber Square(ComplexNumber s1)
  175.     {
  176.         return s1 * s1;
  177.     }
  178.  
  179.     public static ComplexNumber Sqrt(double num)
  180.     {
  181.         if (num < 0)
  182.             return new ComplexNumber(0, Math.Sqrt(-num));
  183.         else
  184.             return new ComplexNumber(Math.Sqrt(num), 0);
  185.     }
  186.     #endregion
  187.  
  188.     public override string ToString()
  189.     {
  190.         string connector = Imaginary < 0 ? "-" : "+";
  191.         return $"{Real} {connector} {Math.Abs(Imaginary)}i";
  192.     }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement