/* nag_complex (a02bac) Example Program.
 *
 * Copyright 2017 Numerical Algorithms Group.
 *
 * Mark 26.1, 2017.
 */

#include <nag.h>
#include <stdio.h>
#include <nag_stdlib.h>
#include <naga02.h>

int main(void)
{
  Integer exit_status = 0;
  Complex v, w, z;
  double r, theta, x, y;
  Nag_Boolean equal, not_equal;

  printf("nag_complex (a02bac) Example Program Results\n");

  x = 2.0;
  y = -3.0;
  /* nag_complex (a02bac).
   * Complex number from real and imaginary parts
   */
  z = nag_complex(x, y);

  printf("  %-21s  %s    %8s =  %7.4f, %7.4f\n", "", "", "x, y", x, y);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex",
         "z", "(x,y)", z.re, z.im);
  /* nag_complex_real (a02bbc).
   * Real part of a complex number
   */
  printf("  %-21s: %s    %8s =  %7.4f\n", "nag_complex_real",
         "", "real(z)", nag_complex_real(z));
  /* nag_complex_imag (a02bcc).
   * Imaginary part of a complex number
   */
  printf("  %-21s: %s    %8s =  %7.4f\n", "nag_complex_imag",
         "", "imag(z)", nag_complex_imag(z));
  /* nag_complex (a02bac), see above. */
  v = nag_complex(3.0, 1.25);
  /* nag_complex (a02bac), see above. */
  w = nag_complex(2.5, -1.75);
  printf("  %-21s: %s    %8s = (%7.4f, %7.4f)\n", "nag_complex", "",
         "v", v.re, v.im);
  printf("  %-21s: %s    %8s = (%7.4f, %7.4f)\n", "nag_complex", "",
         "w", w.re, w.im);
  /* nag_complex_add (a02cac).
   * Addition of two complex numbers
   */
  z = nag_complex_add(v, w);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_add",
         "z", "v+w", z.re, z.im);
  /* nag_complex_subtract (a02cbc).
   * Subtraction of two complex numbers
   */
  z = nag_complex_subtract(v, w);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n",
         "nag_complex_subtract", "z", "v-w", z.re, z.im);
  /* nag_complex_multiply (a02ccc).
   * Multiplication of two complex numbers
   */
  z = nag_complex_multiply(v, w);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n",
         "nag_complex_multiply", "z", "v*w", z.re, z.im);
  /* nag_complex_divide (a02cdc).
   * Quotient of two complex numbers
   */
  z = nag_complex_divide(v, w);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_divide",
         "z", "v/w", z.re, z.im);
  /* nag_complex_negate (a02cec).
   * Negation of a complex number
   */
  z = nag_complex_negate(w);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_negate",
         "z", "-w", z.re, z.im);
  /* nag_complex_conjg (a02cfc).
   * Conjugate of a complex number
   */
  z = nag_complex_conjg(w);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_conjg",
         "z", "conjg(w)", z.re, z.im);
  /* nag_complex_equal (a02cgc).
   * Equality of two complex numbers
   */
  equal = nag_complex_equal(v, w);
  if (equal)
    printf("  %-21s: %s == %s\n", "nag_complex_equal", "v", "w");
  else
    printf("  %-21s: %s != %s\n", "nag_complex_equal", "v", "w");
  /* nag_complex_not_equal (a02chc).
   * Inequality of two complex numbers
   */
  not_equal = nag_complex_not_equal(w, z);
  if (not_equal)
    printf("  %-21s: %s != %s\n\n", "nag_complex_not_equal", "w", "z");
  else
    printf("  %-21s: %s == %s\n\n", "nag_complex_not_equal", "w", "z");

  /* nag_complex_arg (a02dac).
   * Argument of a complex number
   */
  theta = nag_complex_arg(z);
  printf("  %-21s: %s    %8s =  %7.4f\n", "nag_complex_arg", "",
         "arg(z)", theta);
  /* nag_complex_abs (a02dbc).
   * Modulus of a complex number
   */
  r = nag_complex_abs(z);
  printf("  %-21s: %s = %8s =  %7.4f\n", "nag_complex_abs", "r", "abs(z)", r);
  /* nag_complex_sqrt (a02dcc).
   * Square root of a complex number
   */
  v = nag_complex_sqrt(z);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_sqrt",
         "v", "sqrt(z)", v.re, v.im);
  /* nag_complex_i_power (a02ddc).
   * Complex number raised to integer power
   */
  v = nag_complex_i_power(z, (Integer) 3);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_i_power",
         "v", "z**3", v.re, v.im);
  /* nag_complex_r_power (a02dec).
   * Complex number raised to real power
   */
  v = nag_complex_r_power(z, 2.5);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_r_power",
         "v", "z**2.5", v.re, v.im);
  /* nag_complex_c_power (a02dfc).
   * Complex number raised to complex power
   */
  v = nag_complex_c_power(z, w);
  printf("  %-21s: %s = %8s = (%7.4f,%8.4f)\n", "nag_complex_c_power",
         "v", "z**w", v.re, v.im);
  /* nag_complex_log (a02dgc).
   * Complex logarithm
   */
  v = nag_complex_log(z);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_log",
         "v", "log(z)", v.re, v.im);
  /* nag_complex_exp (a02dhc).
   * Complex exponential
   */
  z = nag_complex_exp(v);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_exp",
         "z", "exp(v)", z.re, z.im);
  /* nag_complex_sin (a02djc).
   * Complex sine
   */
  v = nag_complex_sin(z);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_sin",
         "v", "sin(z)", v.re, v.im);
  /* nag_complex_cos (a02dkc).
   * Complex cosine
   */
  v = nag_complex_cos(z);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_cos",
         "v", "cos(z)", v.re, v.im);
  /* nag_complex_tan (a02dlc).
   * Complex tangent
   */
  v = nag_complex_tan(z);
  printf("  %-21s: %s = %8s = (%7.4f, %7.4f)\n", "nag_complex_tan",
         "v", "tan(z)", v.re, v.im);
  /* nag_complex_divide (a02cdc), see above. */
  v = nag_complex_divide(nag_complex_sin(z), nag_complex_cos(z));
  printf("  %-21s:%13s = (%7.4f, %7.4f)\n", "nag_complex_divide",
         "sin(z)/cos(z)", v.re, v.im);

  return exit_status;
}