Advertisement
zhangsongcui

simd_complex (C# ver)

Jul 21st, 2012
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.56 KB | None | 0 0
  1. using System.Numerics;
  2. using Mono.Simd;
  3.  
  4. struct SimdComplex {
  5.     public SimdComplex(double r)
  6.     {
  7.         value = new Vector2d(r, 0);
  8.     }
  9.     public SimdComplex(double r, double i)
  10.     {
  11.         value = new Vector2d(r, i);
  12.     }
  13.     public SimdComplex(Vector2d v)
  14.     {
  15.         value = v;
  16.     }
  17.  
  18.     public static explicit operator Vector2d(SimdComplex rhs)
  19.     {
  20.         return rhs.value;
  21.     }
  22.  
  23.     public static SimdComplex operator +(SimdComplex left, SimdComplex right)
  24.     {
  25.         Vector2d a_b = left.value, c_d = right.value;
  26.         return new SimdComplex(a_b + c_d);
  27.     }
  28.  
  29.     public static SimdComplex operator -(SimdComplex left, SimdComplex right)
  30.     {
  31.         Vector2d a_b = left.value, c_d = right.value;
  32.         return new SimdComplex(a_b - c_d);
  33.     }
  34.  
  35.     public static SimdComplex operator *(SimdComplex left, SimdComplex right)
  36.     {
  37.         Vector2d a_b = left.value, c_d = right.value;
  38.         var c_c = c_d.Duplicate();
  39.         var ac_bc = a_b * c_c;
  40.  
  41.         var b_a = a_b.Shuffle(a_b, 1);
  42.         var d_d = c_d.InterleaveHigh(c_d);
  43.         var bd_ad = b_a * d_d;
  44.         return new SimdComplex(ac_bc.AddSub(bd_ad));
  45.     }
  46.  
  47.     public static SimdComplex operator /(SimdComplex left, SimdComplex right)
  48.     {
  49.         Vector2d a_b = left.value, c_d = right.value;
  50.         var b_a = a_b.Shuffle(a_b, 1);
  51.         var c_c = c_d.Duplicate();
  52.         var bc_ac = b_a * c_c;
  53.  
  54.         var d_d = c_d.InterleaveHigh(c_d);
  55.         var ad_bd = a_b * d_d;
  56.  
  57.         var t = bc_ac.AddSub(ad_bd); // (bc-ad) + (ac+bd)i
  58.         var numerator = t.Shuffle(t, 1); // (ac+bd) + (bc-ad)i
  59.         var cc_dd = c_d * c_d;
  60.         var denominator = cc_dd.HorizontalAdd(cc_dd); // (cc+dd) + (cc+dd)i
  61.         return new SimdComplex(numerator / denominator);
  62.     }
  63.  
  64.     double Real {
  65.         get { return this.value.X; }
  66.         set { this.value.X = value; }
  67.     }
  68.  
  69.     double Imag {
  70.         get { return this.value.Y; }
  71.         set { this.value.Y = value; }
  72.     }
  73.  
  74.     public override string ToString()
  75.     {
  76.         return string.Format("({0}, {1})", Real, Imag);
  77.     }
  78.  
  79.     private Vector2d value;
  80. }
  81.  
  82. class MainClass
  83. {
  84.     public static void Main(string[] args)
  85.     {
  86.         SimdComplex d1 = new SimdComplex(1, 2), d2 = new SimdComplex(3, 4);
  87.         Console.WriteLine(d1 * d2);
  88.         Console.WriteLine(d1 / d2);
  89.         Complex c1 = new Complex(1, 2), c2 = new Complex(3, 4);
  90.         Console.WriteLine(c1 * c2);
  91.         Console.WriteLine(c1 / c2);
  92.     }
  93. }
  94.  
  95. Expected output:
  96. (-5, 10)
  97. (0.44, 0.08)
  98. (-5, 10)
  99. (0.44, 0.08)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement