Blame specfunc/transport.c

Packit 67cb25
/* specfunc/transport.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
/* Author:  G. Jungman */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_errno.h>
Packit 67cb25
#include <gsl/gsl_sf_transport.h>
Packit 67cb25
Packit 67cb25
#include "error.h"
Packit 67cb25
#include "check.h"
Packit 67cb25
Packit 67cb25
#include "chebyshev.h"
Packit 67cb25
#include "cheb_eval.c"
Packit 67cb25
Packit 67cb25
static double transport2_data[18] = {
Packit 67cb25
   1.671760446434538503,
Packit 67cb25
  -0.147735359946794490,
Packit 67cb25
   0.148213819946936338e-01,
Packit 67cb25
  -0.14195330326305613e-02,
Packit 67cb25
   0.1306541324415708e-03,
Packit 67cb25
  -0.117155795867579e-04,
Packit 67cb25
   0.10333498445756e-05,
Packit 67cb25
  -0.901911304223e-07,
Packit 67cb25
   0.78177169833e-08,
Packit 67cb25
  -0.6744565684e-09,
Packit 67cb25
   0.579946394e-10,
Packit 67cb25
  -0.49747619e-11,
Packit 67cb25
   0.425961e-12,
Packit 67cb25
  -0.36422e-13,
Packit 67cb25
   0.3111e-14,
Packit 67cb25
  -0.265e-15,
Packit 67cb25
   0.23e-16,
Packit 67cb25
  -0.19e-17
Packit 67cb25
};
Packit 67cb25
static cheb_series transport2_cs = {
Packit 67cb25
  transport2_data,
Packit 67cb25
  17,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static double transport3_data[18] = {
Packit 67cb25
   0.762012543243872007,
Packit 67cb25
  -0.105674387705058533,
Packit 67cb25
   0.119778084819657810e-01,
Packit 67cb25
  -0.12144015203698307e-02,
Packit 67cb25
   0.1155099769392855e-03,
Packit 67cb25
  -0.105815992124423e-04,
Packit 67cb25
   0.9474663385302e-06,
Packit 67cb25
  -0.836221212858e-07,
Packit 67cb25
   0.73109099278e-08,
Packit 67cb25
  -0.6350594779e-09,
Packit 67cb25
   0.549118282e-10,
Packit 67cb25
  -0.47321395e-11,
Packit 67cb25
   0.4067695e-12,
Packit 67cb25
  -0.348971e-13,
Packit 67cb25
   0.29892e-14,
Packit 67cb25
  -0.256e-15,
Packit 67cb25
   0.219e-16,
Packit 67cb25
  -0.19e-17
Packit 67cb25
};
Packit 67cb25
static cheb_series transport3_cs = {
Packit 67cb25
  transport3_data,
Packit 67cb25
  17,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
static double transport4_data[18] = {
Packit 67cb25
  0.4807570994615110579,
Packit 67cb25
 -0.8175378810321083956e-01,
Packit 67cb25
  0.1002700665975162973e-01,
Packit 67cb25
 -0.10599339359820151e-02,
Packit 67cb25
  0.1034506245030405e-03,
Packit 67cb25
 -0.96442705485899e-05,
Packit 67cb25
  0.8745544408515e-06,
Packit 67cb25
 -0.779321207981e-07,
Packit 67cb25
  0.68649886141e-08,
Packit 67cb25
 -0.5999571076e-09,
Packit 67cb25
  0.521366241e-10,
Packit 67cb25
 -0.45118382e-11,
Packit 67cb25
  0.3892159e-12,
Packit 67cb25
 -0.334936e-13,
Packit 67cb25
  0.28767e-14,
Packit 67cb25
 -0.2467e-15,
Packit 67cb25
  0.211e-16,
Packit 67cb25
 -0.18e-17
Packit 67cb25
};
Packit 67cb25
static cheb_series transport4_cs = {
Packit 67cb25
  transport4_data,
Packit 67cb25
  17,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
static double transport5_data[18] = {
Packit 67cb25
   0.347777777133910789,
Packit 67cb25
  -0.66456988976050428e-01,
Packit 67cb25
   0.8611072656883309e-02,
Packit 67cb25
  -0.9396682223755538e-03,
Packit 67cb25
   0.936324806081513e-04,
Packit 67cb25
  -0.88571319340833e-05,
Packit 67cb25
   0.811914989145e-06,
Packit 67cb25
  -0.72957654233e-07,
Packit 67cb25
   0.646971455e-08,
Packit 67cb25
  -0.568490283e-09,
Packit 67cb25
   0.49625598e-10,
Packit 67cb25
  -0.4310940e-11,
Packit 67cb25
   0.373100e-12,
Packit 67cb25
  -0.32198e-13,
Packit 67cb25
   0.2772e-14,
Packit 67cb25
  -0.238e-15,
Packit 67cb25
   0.21e-16,
Packit 67cb25
  -0.18e-17
Packit 67cb25
};
Packit 67cb25
static cheb_series transport5_cs = {
Packit 67cb25
  transport5_data,
Packit 67cb25
  17,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
static
Packit 67cb25
double
Packit 67cb25
transport_sumexp(const int numexp, const int order, const double t, double x)
Packit 67cb25
{
Packit 67cb25
  double rk = (double)numexp;
Packit 67cb25
  double sumexp = 0.0;
Packit 67cb25
  int k;
Packit 67cb25
  for(k=1; k<=numexp; k++) {
Packit 67cb25
    double sum2 = 1.0;
Packit 67cb25
    double xk  = 1.0/(rk*x);
Packit 67cb25
    double xk1 = 1.0;
Packit 67cb25
    int j;
Packit 67cb25
    for(j=1; j<=order; j++) {
Packit 67cb25
      sum2 = sum2*xk1*xk + 1.0;
Packit 67cb25
      xk1 += 1.0;
Packit 67cb25
    }
Packit 67cb25
    sumexp *= t;
Packit 67cb25
    sumexp += sum2;
Packit 67cb25
    rk -= 1.0;
Packit 67cb25
  }
Packit 67cb25
  return sumexp;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_transport_2_e(const double x, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  const double val_infinity = 3.289868133696452873;
Packit 67cb25
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < 0.0) {
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
Packit 67cb25
    result->val = x;
Packit 67cb25
    result->err = GSL_DBL_EPSILON*fabs(x) + x*x/2.0;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x <= 4.0) {
Packit 67cb25
    double t = (x*x/8.0 - 0.5) - 0.5;
Packit 67cb25
    gsl_sf_result result_c;
Packit 67cb25
    cheb_eval_e(&transport2_cs, t, &result_c);
Packit 67cb25
    result->val  = x * result_c.val;
Packit 67cb25
    result->err  = x * result_c.err;
Packit 67cb25
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < -GSL_LOG_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 2, exp(-x), x);
Packit 67cb25
    const double t = 2.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val  = val_infinity;
Packit 67cb25
      result->err  = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + fabs(t) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 2.0/GSL_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 2, 1.0, x);
Packit 67cb25
    const double t = 2.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double t = 2.0 * log(x) - x;
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_transport_3_e(const double x, gsl_sf_result * result)
Packit 67cb25
{ 
Packit 67cb25
  const double val_infinity = 7.212341418957565712;
Packit 67cb25
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < 0.0) {
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(x == 0.0) {
Packit 67cb25
    result->val = 0.0;
Packit 67cb25
    result->err = 0.0;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
Packit 67cb25
    result->val = 0.5*x*x;
Packit 67cb25
    result->err = 2.0 * GSL_DBL_EPSILON * result->val;
Packit 67cb25
    CHECK_UNDERFLOW(result);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x <= 4.0) {
Packit 67cb25
    const double x2 = x*x;
Packit 67cb25
    const double t = (x2/8.0 - 0.5) - 0.5;
Packit 67cb25
    gsl_sf_result result_c;
Packit 67cb25
    cheb_eval_e(&transport3_cs, t, &result_c);
Packit 67cb25
    result->val  = x2 * result_c.val;
Packit 67cb25
    result->err  = x2 * result_c.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < -GSL_LOG_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 3, exp(-x), x);
Packit 67cb25
    const double t = 3.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + fabs(t) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0/GSL_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 3, 1.0, x);
Packit 67cb25
    const double t = 3.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double t = 3.0 * log(x) - x;
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_transport_4_e(const double x, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  const double val_infinity = 25.97575760906731660;
Packit 67cb25
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < 0.0) {
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(x == 0.0) {
Packit 67cb25
    result->val = 0.0;
Packit 67cb25
    result->err = 0.0;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
Packit 67cb25
    result->val = x*x*x/3.0;
Packit 67cb25
    result->err = 3.0 * GSL_DBL_EPSILON * result->val;
Packit 67cb25
    CHECK_UNDERFLOW(result);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x <= 4.0) {
Packit 67cb25
    const double x2 = x*x;
Packit 67cb25
    const double t = (x2/8.0 - 0.5) - 0.5;
Packit 67cb25
    gsl_sf_result result_c;
Packit 67cb25
    cheb_eval_e(&transport4_cs, t, &result_c);
Packit 67cb25
    result->val  = x2*x * result_c.val;
Packit 67cb25
    result->err  = x2*x * result_c.err;
Packit 67cb25
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < -GSL_LOG_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 4, exp(-x), x);
Packit 67cb25
    const double t = 4.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0/GSL_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 4, 1.0, x);
Packit 67cb25
    const double t = 4.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double t = 4.0 * log(x) - x;
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_transport_5_e(const double x, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  const double val_infinity = 124.4313306172043912;
Packit 67cb25
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < 0.0) {
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(x == 0.0) {
Packit 67cb25
    result->val = 0.0;
Packit 67cb25
    result->err = 0.0;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
Packit 67cb25
    result->val = x*x*x*x/4.0;
Packit 67cb25
    result->err = 4.0 * GSL_DBL_EPSILON * result->val;
Packit 67cb25
    CHECK_UNDERFLOW(result);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x <= 4.0) {
Packit 67cb25
    const double x2 = x*x;
Packit 67cb25
    const double t = (x2/8.0 - 0.5) - 0.5;
Packit 67cb25
    gsl_sf_result result_c;
Packit 67cb25
    cheb_eval_e(&transport5_cs, t, &result_c);
Packit 67cb25
    result->val  = x2*x2 * result_c.val;
Packit 67cb25
    result->err  = x2*x2 * result_c.err;
Packit 67cb25
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < -GSL_LOG_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 5, exp(-x), x);
Packit 67cb25
    const double t = 5.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 3.0/GSL_DBL_EPSILON) {
Packit 67cb25
    const int    numexp = 1;
Packit 67cb25
    const double sumexp = transport_sumexp(numexp, 5, 1.0, x);
Packit 67cb25
    const double t = 5.0 * log(x) - x + log(sumexp);
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double t = 5.0 * log(x) - x;
Packit 67cb25
    if(t < GSL_LOG_DBL_EPSILON) {
Packit 67cb25
      result->val = val_infinity;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      const double et = exp(t);
Packit 67cb25
      result->val = val_infinity - et;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
Packit 67cb25
    }
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
#include "eval.h"
Packit 67cb25
Packit 67cb25
double gsl_sf_transport_2(const double x)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_transport_2_e(x, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_transport_3(const double x)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_transport_3_e(x, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_transport_4(const double x)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_transport_4_e(x, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_transport_5(const double x)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_transport_5_e(x, &result));
Packit 67cb25
}