/* nag_specfun_2f1_real (s22bec) Example Program.
 *
 * Copyright 2014 Numerical Algorithms Group.
 *
 * Mark 24, 2013.
 */

#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;
}