NAG Library Manual, Mark 30
Interfaces:  FL   CL   CPP   AD 

NAG CL Interface Introduction
Example description
/* nag_specfun_hyperg_confl_real_scaled (s22bbc) Example Program.
 *
 * Copyright 2024 Numerical Algorithms Group.
 *
 * Mark 30.0, 2024.
 */

#include <math.h>
#include <nag.h>
#include <stdio.h>
#include <string.h>

int main(void) {
  /* Scalars */
  Integer exit_status = 0;
  Integer k, maxexponent, scm;
  double ani, adr, bni, bdr, delta, frm, x;
  /* Arrays */
  double frmv[2];
  Integer scmv[2];
  /* Nag Types */
  NagError fail;

  maxexponent = X02BLC;
  printf(
      "nag_specfun_hyperg_confl_real_scaled (s22bbc) Example Program Results\n\n");

  ani = -10.0;
  bni = 30.0;
  delta = 1.0E-4;
  adr = delta;
  bdr = -delta;
  x = 25.0;

  printf("%9s%10s%10s%12s%9s%12s\n", "a", "b", "x", "frm", "scm", "M(a,b,x)");
  for (k = 0; k < 2; k++) {
    INIT_FAIL(fail);
    /* Compute the real confluent hypergeometric function M(a,b,x) in scaled
     * form using nag_specfun_hyperg_confl_real_scaled (s22bbc).
     */
    nag_specfun_hyperg_confl_real_scaled(ani, adr, bni, bdr, x, &frm, &scm,
                                         &fail);
    switch (fail.code) {
    case NE_NOERROR:
    case NW_UNDERFLOW_WARN:
    case NW_SOME_PRECISION_LOSS: {
      if (scm < maxexponent)
        printf(" %9.4f %9.4f %9.4f %13.4e %5" NAG_IFMT " %13.4e\n", ani + adr,
               bni + bdr, x, frm, scm, frm * pow(2.0, scm));
      else
        printf(" %9.4f %9.4f %9.4f %13.4e %5" NAG_IFMT " %17s\n", ani + adr,
               bni + bdr, x, frm, scm, "Not Representable");
      frmv[k] = frm;
      scmv[k] = scm;
      break;
    }
    default: {
      /* Either the result has overflowed, no accuracy may be assumed,
       * or an input error has been detected.
       */
      printf(" %9.4f %9.4f %9.4f %17s\n", ani + adr, bni + bdr, x, "FAILED");
      exit_status = 1;
      goto END;
    }
    }
    adr = -adr;
    bdr = -bdr;
  }

  /* Calculate the product M1*M2 */
  frm = frmv[0] * frmv[1];
  scm = scmv[0] + scmv[1];
  printf("\n");
  if (scm < maxexponent)
    printf("%-30s%12.4e%6" NAG_IFMT "%12.4e\n", "Solution product", frm, scm,
           frm * pow(2.0, scm));
  else
    printf("%-30s%12.4e%6" NAG_IFMT "%17s\n", "Solution product", frm, scm,
           "Not Representable");

  /* Calculate the ratio M1/M2 */
  if (frmv[1] != 0.0) {
    frm = frmv[0] / frmv[1];
    scm = scmv[0] - scmv[1];
    printf("\n");
    if (scm < maxexponent)
      printf("%-30s%12.4e%6" NAG_IFMT "%12.4e\n", "Solution ratio", frm, scm,
             frm * pow(2.0, scm));
    else
      printf("%-30s%12.4e%6" NAG_IFMT "%17s\n", "Solution ratio", frm, scm,
             "Not Representable");
  }

END:
  return exit_status;
}