/* nag_specfun_2f1_real (s22bec) Example Program.
 *
 * Copyright 2017 Numerical Algorithms Group.
 *
 * Mark 26.1, 2017.
 */

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

void construct_table(double a, double b, double c);

int main(void)
{
  /* Scalars */
  Integer exit_status = 0;
  Integer kx;
  double a, b, c, f, x;
  /* Nag Types */
  NagError fail;

  INIT_FAIL(fail);

  printf("nag_specfun_2f1_real (s22bec) Example Program Results\n\n");

  a = 1.2;
  b = -2.6;
  c = 3.5;

  construct_table(a, b, c);

  for (kx = 1; kx < 22; kx++) {
    x = -4.0 + ((double) (kx - 1)) * 0.25;
    /* Evaluate Real Gauss hypergeometric function 2F1(a,b;c;x) using
     * nag_specfun_2f1_real (s22bec).
     */
    f = nag_specfun_2f1_real(a, b, c, x, &fail);
    switch (fail.code) {
    case NE_NOERROR:
    case NW_UNDERFLOW_WARN:
    case NW_SOME_PRECISION_LOSS:
    case NE_TOTAL_PRECISION_LOSS:
      printf("    %10.2f     %10.4f\n", x, f);
      break;
    case NE_INFINITE:
    case NW_OVERFLOW_WARN:
    case NE_OVERFLOW:
      if (f >= 0.0)
        printf("    %10.2f   %13s\n", x, "+Infinity");
      else
        printf("    %10.2f   %13s\n", x, "-Infinity");
      break;
    case NE_CANNOT_CALCULATE:
      printf("    %10.2f   %13s\n", x, "NaN");
      break;
    default:
      printf(" Illegal parameter.");
      exit_status = 1;
      goto END;
      break;
    }
  }
END:
  return exit_status;
}

void construct_table(double a, double b, double c)
{
  printf("            a              b              c\n");
  printf("+--------------+--------------+--------------+\n");
  printf("    %10.2f     %10.2f     %10.2f\n\n", a, b, c);
  printf("            x    2F1(a,b;c;x)\n");
  printf("+--------------+--------------+\n");
  return;
}