Blame specfunc/airy_der.c

Packit 67cb25
/* specfunc/airy_der.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_exp.h>
Packit 67cb25
#include <gsl/gsl_sf_airy.h>
Packit 67cb25
Packit 67cb25
#include "error.h"
Packit 67cb25
Packit 67cb25
#include "chebyshev.h"
Packit 67cb25
#include "cheb_eval_mode.c"
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* based on SLATEC aide.f, bide.f, aid.f, bid.f, r9admp.f */
Packit 67cb25
 
Packit 67cb25
/* 
Packit 67cb25
 series for aif on the interval -1.00000e+00 to  1.00000e+00
Packit 67cb25
                                        with weighted error   5.22e-18
Packit 67cb25
                                         log weighted error  17.28
Packit 67cb25
                               significant figures required  16.01
Packit 67cb25
                                    decimal places required  17.73
Packit 67cb25
*/
Packit 67cb25
static double aif_data[8] = {
Packit 67cb25
   0.10527461226531408809,
Packit 67cb25
   0.01183613628152997844,
Packit 67cb25
   0.00012328104173225664,
Packit 67cb25
   0.00000062261225638140,
Packit 67cb25
   0.00000000185298887844,
Packit 67cb25
   0.00000000000363328873,
Packit 67cb25
   0.00000000000000504622,
Packit 67cb25
   0.00000000000000000522
Packit 67cb25
};
Packit 67cb25
static cheb_series aif_cs = {
Packit 67cb25
  aif_data,
Packit 67cb25
  7,
Packit 67cb25
  -1, 1,
Packit 67cb25
  7
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for aig on the interval -1.00000e+00 to  1.00000e+00
Packit 67cb25
                                        with weighted error   3.14e-19
Packit 67cb25
                                         log weighted error  18.50
Packit 67cb25
                               significant figures required  17.44
Packit 67cb25
                                    decimal places required  18.98
Packit 67cb25
*/
Packit 67cb25
static double aig_data[9] = {
Packit 67cb25
   0.021233878150918666852,
Packit 67cb25
   0.086315930335214406752,
Packit 67cb25
   0.001797594720383231358,
Packit 67cb25
   0.000014265499875550693,
Packit 67cb25
   0.000000059437995283683,
Packit 67cb25
   0.000000000152403366479,
Packit 67cb25
   0.000000000000264587660,
Packit 67cb25
   0.000000000000000331562,
Packit 67cb25
   0.000000000000000000314
Packit 67cb25
};
Packit 67cb25
static cheb_series aig_cs = {
Packit 67cb25
  aig_data,
Packit 67cb25
  8,
Packit 67cb25
  -1, 1,
Packit 67cb25
  8
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for aip2 on the interval  0.00000e+00 to  1.25000e-01
Packit 67cb25
                                        with weighted error   2.15e-17
Packit 67cb25
                                         log weighted error  16.67
Packit 67cb25
                               significant figures required  14.27
Packit 67cb25
                                    decimal places required  17.26
Packit 67cb25
*/
Packit 67cb25
static double aip2_data[15] = {
Packit 67cb25
    0.0065457691989713757,
Packit 67cb25
    0.0023833724120774592,
Packit 67cb25
   -0.0000430700770220586,
Packit 67cb25
    0.0000015629125858629,
Packit 67cb25
   -0.0000000815417186163,
Packit 67cb25
    0.0000000054103738057,
Packit 67cb25
   -0.0000000004284130883,
Packit 67cb25
    0.0000000000389497963,
Packit 67cb25
   -0.0000000000039623161,
Packit 67cb25
    0.0000000000004428184,
Packit 67cb25
   -0.0000000000000536297,
Packit 67cb25
    0.0000000000000069650,
Packit 67cb25
   -0.0000000000000009620,
Packit 67cb25
    0.0000000000000001403,
Packit 67cb25
   -0.0000000000000000215
Packit 67cb25
};
Packit 67cb25
static cheb_series aip2_cs = {
Packit 67cb25
  aip2_data,
Packit 67cb25
  14,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for aip1 on the interval  1.25000e-01 to  1.00000e+00
Packit 67cb25
                                        with weighted error   2.60e-17
Packit 67cb25
                                         log weighted error  16.58
Packit 67cb25
                               significant figures required  14.91
Packit 67cb25
                                    decimal places required  17.28
Packit 67cb25
*/
Packit 67cb25
static double aip1_data[25] = {
Packit 67cb25
    0.0358865097808301538,
Packit 67cb25
    0.0114668575627764899,
Packit 67cb25
   -0.0007592073583861400,
Packit 67cb25
    0.0000869517610893841,
Packit 67cb25
   -0.0000128237294298592,
Packit 67cb25
    0.0000022062695681038,
Packit 67cb25
   -0.0000004222295185921,
Packit 67cb25
    0.0000000874686415726,
Packit 67cb25
   -0.0000000192773588418,
Packit 67cb25
    0.0000000044668460054,
Packit 67cb25
   -0.0000000010790108052,
Packit 67cb25
    0.0000000002700029447,
Packit 67cb25
   -0.0000000000696480108,
Packit 67cb25
    0.0000000000184489907,
Packit 67cb25
   -0.0000000000050027817,
Packit 67cb25
    0.0000000000013852243,
Packit 67cb25
   -0.0000000000003908218,
Packit 67cb25
    0.0000000000001121536,
Packit 67cb25
   -0.0000000000000326862,
Packit 67cb25
    0.0000000000000096619,
Packit 67cb25
   -0.0000000000000028935,
Packit 67cb25
    0.0000000000000008770,
Packit 67cb25
   -0.0000000000000002688,
Packit 67cb25
    0.0000000000000000832,
Packit 67cb25
   -0.0000000000000000260
Packit 67cb25
};
Packit 67cb25
static cheb_series aip1_cs = {
Packit 67cb25
  aip1_data,
Packit 67cb25
  24,
Packit 67cb25
  -1, 1,
Packit 67cb25
  14
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for bif on the interval -1.00000e+00 to  1.00000e+00
Packit 67cb25
                                        with weighted error   9.05e-18
Packit 67cb25
                                         log weighted error  17.04
Packit 67cb25
                               significant figures required  15.83
Packit 67cb25
                                    decimal places required  17.49
Packit 67cb25
*/
Packit 67cb25
static double bif_data[8] = {
Packit 67cb25
   0.1153536790828570243,
Packit 67cb25
   0.0205007894049192875,
Packit 67cb25
   0.0002135290278902876,
Packit 67cb25
   0.0000010783960614677,
Packit 67cb25
   0.0000000032094708833,
Packit 67cb25
   0.0000000000062930407,
Packit 67cb25
   0.0000000000000087403,
Packit 67cb25
   0.0000000000000000090
Packit 67cb25
};
Packit 67cb25
static cheb_series bif_cs = {
Packit 67cb25
  bif_data,
Packit 67cb25
  7,
Packit 67cb25
  -1, 1,
Packit 67cb25
  7
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for big on the interval -1.00000e+00 to  1.00000e+00
Packit 67cb25
                                        with weighted error   5.44e-19
Packit 67cb25
                                         log weighted error  18.26
Packit 67cb25
                               significant figures required  17.46
Packit 67cb25
                                    decimal places required  18.74
Packit 67cb25
*/
Packit 67cb25
static double big_data[9] = {
Packit 67cb25
   -0.097196440416443537390,
Packit 67cb25
    0.149503576843167066571,
Packit 67cb25
    0.003113525387121326042,
Packit 67cb25
    0.000024708570579821297,
Packit 67cb25
    0.000000102949627731379,
Packit 67cb25
    0.000000000263970373987,
Packit 67cb25
    0.000000000000458279271,
Packit 67cb25
    0.000000000000000574283,
Packit 67cb25
    0.000000000000000000544
Packit 67cb25
};
Packit 67cb25
static cheb_series big_cs = {
Packit 67cb25
  big_data,
Packit 67cb25
  8,
Packit 67cb25
  -1, 1,
Packit 67cb25
  8
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for bif2 on the interval  1.00000e+00 to  8.00000e+00
Packit 67cb25
                                        with weighted error   3.82e-19
Packit 67cb25
                                         log weighted error  18.42
Packit 67cb25
                               significant figures required  17.68
Packit 67cb25
                                    decimal places required  18.92
Packit 67cb25
*/
Packit 67cb25
static double bif2_data[10] = {
Packit 67cb25
   0.323493987603522033521,
Packit 67cb25
   0.086297871535563559139,
Packit 67cb25
   0.002994025552655397426,
Packit 67cb25
   0.000051430528364661637,
Packit 67cb25
   0.000000525840250036811,
Packit 67cb25
   0.000000003561751373958,
Packit 67cb25
   0.000000000017146864007,
Packit 67cb25
   0.000000000000061663520,
Packit 67cb25
   0.000000000000000171911,
Packit 67cb25
   0.000000000000000000382
Packit 67cb25
};
Packit 67cb25
static cheb_series bif2_cs = {
Packit 67cb25
  bif2_data,
Packit 67cb25
  9,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for big2 on the interval  1.00000e+00 to  8.00000e+00
Packit 67cb25
                                        with weighted error   3.35e-17
Packit 67cb25
                                         log weighted error  16.48
Packit 67cb25
                               significant figures required  16.52
Packit 67cb25
                                    decimal places required  16.98
Packit 67cb25
*/
Packit 67cb25
static double big2_data[10] = {
Packit 67cb25
   1.6062999463621294578,
Packit 67cb25
   0.7449088819876088652,
Packit 67cb25
   0.0470138738610277380,
Packit 67cb25
   0.0012284422062548239,
Packit 67cb25
   0.0000173222412256624,
Packit 67cb25
   0.0000001521901652368,
Packit 67cb25
   0.0000000009113560249,
Packit 67cb25
   0.0000000000039547918,
Packit 67cb25
   0.0000000000000130017,
Packit 67cb25
   0.0000000000000000335
Packit 67cb25
};
Packit 67cb25
static cheb_series big2_cs = {
Packit 67cb25
  big2_data,
Packit 67cb25
  9,
Packit 67cb25
  -1, 1,
Packit 67cb25
  9
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for bip2 on the interval  0.00000e+00 to  1.25000e-01
Packit 67cb25
                                        with weighted error   2.07e-18
Packit 67cb25
                                         log weighted error  17.69
Packit 67cb25
                               significant figures required  16.51
Packit 67cb25
                                    decimal places required  18.42
Packit 67cb25
*/
Packit 67cb25
static double bip2_data[29] = {
Packit 67cb25
    -0.13269705443526630495,
Packit 67cb25
    -0.00568443626045977481,
Packit 67cb25
    -0.00015643601119611610,
Packit 67cb25
    -0.00001136737203679562,
Packit 67cb25
    -0.00000143464350991284,
Packit 67cb25
    -0.00000018098531185164,
Packit 67cb25
     0.00000000926177343611,
Packit 67cb25
     0.00000001710005490721,
Packit 67cb25
     0.00000000476698163504,
Packit 67cb25
    -0.00000000035195022023,
Packit 67cb25
    -0.00000000058890614316,
Packit 67cb25
    -0.00000000006678499608,
Packit 67cb25
     0.00000000006395565102,
Packit 67cb25
     0.00000000001554529427,
Packit 67cb25
    -0.00000000000792397000,
Packit 67cb25
    -0.00000000000258326243,
Packit 67cb25
     0.00000000000121655048,
Packit 67cb25
     0.00000000000038707207,
Packit 67cb25
    -0.00000000000022487045,
Packit 67cb25
    -0.00000000000004953477,
Packit 67cb25
     0.00000000000004563782,
Packit 67cb25
     0.00000000000000332998,
Packit 67cb25
    -0.00000000000000921750,
Packit 67cb25
     0.00000000000000094157,
Packit 67cb25
     0.00000000000000167154,
Packit 67cb25
    -0.00000000000000055134,
Packit 67cb25
    -0.00000000000000022369,
Packit 67cb25
     0.00000000000000017487,
Packit 67cb25
     0.00000000000000000207
Packit 67cb25
};
Packit 67cb25
static cheb_series bip2_cs = {
Packit 67cb25
  bip2_data,
Packit 67cb25
  28,
Packit 67cb25
  -1, 1,
Packit 67cb25
  14
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for bip1 on the interval  1.25000e-01 to  3.53553e-01
Packit 67cb25
                                        with weighted error   1.86e-17
Packit 67cb25
                                         log weighted error  16.73
Packit 67cb25
                               significant figures required  15.67
Packit 67cb25
                                    decimal places required  17.42
Packit 67cb25
*/
Packit 67cb25
static double bip1_data[24] = {
Packit 67cb25
   -0.1729187351079553719,
Packit 67cb25
   -0.0149358492984694364,
Packit 67cb25
   -0.0005471104951678566,
Packit 67cb25
    0.0001537966292958408,
Packit 67cb25
    0.0000154353476192179,
Packit 67cb25
   -0.0000065434113851906,
Packit 67cb25
    0.0000003728082407879,
Packit 67cb25
    0.0000002072078388189,
Packit 67cb25
   -0.0000000658173336470,
Packit 67cb25
    0.0000000074926746354,
Packit 67cb25
    0.0000000011101336884,
Packit 67cb25
   -0.0000000007265140553,
Packit 67cb25
    0.0000000001782723560,
Packit 67cb25
   -0.0000000000217346352,
Packit 67cb25
   -0.0000000000020302035,
Packit 67cb25
    0.0000000000019311827,
Packit 67cb25
   -0.0000000000006044953,
Packit 67cb25
    0.0000000000001209450,
Packit 67cb25
   -0.0000000000000125109,
Packit 67cb25
   -0.0000000000000019917,
Packit 67cb25
    0.0000000000000015154,
Packit 67cb25
   -0.0000000000000004977,
Packit 67cb25
    0.0000000000000001155,
Packit 67cb25
   -0.0000000000000000186
Packit 67cb25
};
Packit 67cb25
static cheb_series bip1_cs = {
Packit 67cb25
  bip1_data,
Packit 67cb25
  23,
Packit 67cb25
  -1, 1,
Packit 67cb25
  13
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for an22 on the interval -1.00000e+00 to -1.25000e-01
Packit 67cb25
                                        with weighted error   3.30e-17
Packit 67cb25
                                         log weighted error  16.48
Packit 67cb25
                               significant figures required  14.95
Packit 67cb25
                                    decimal places required  17.24
Packit 67cb25
*/
Packit 67cb25
static double an22_data[33] = {
Packit 67cb25
    0.0537418629629794329,
Packit 67cb25
   -0.0126661435859883193,
Packit 67cb25
   -0.0011924334106593007,
Packit 67cb25
   -0.0002032327627275655,
Packit 67cb25
   -0.0000446468963075164,
Packit 67cb25
   -0.0000113359036053123,
Packit 67cb25
   -0.0000031641352378546,
Packit 67cb25
   -0.0000009446708886149,
Packit 67cb25
   -0.0000002966562236472,
Packit 67cb25
   -0.0000000969118892024,
Packit 67cb25
   -0.0000000326822538653,
Packit 67cb25
   -0.0000000113144618964,
Packit 67cb25
   -0.0000000040042691002,
Packit 67cb25
   -0.0000000014440333684,
Packit 67cb25
   -0.0000000005292853746,
Packit 67cb25
   -0.0000000001967763374,
Packit 67cb25
   -0.0000000000740800096,
Packit 67cb25
   -0.0000000000282016314,
Packit 67cb25
   -0.0000000000108440066,
Packit 67cb25
   -0.0000000000042074801,
Packit 67cb25
   -0.0000000000016459150,
Packit 67cb25
   -0.0000000000006486827,
Packit 67cb25
   -0.0000000000002574095,
Packit 67cb25
   -0.0000000000001027889,
Packit 67cb25
   -0.0000000000000412846,
Packit 67cb25
   -0.0000000000000166711,
Packit 67cb25
   -0.0000000000000067657,
Packit 67cb25
   -0.0000000000000027585,
Packit 67cb25
   -0.0000000000000011296,
Packit 67cb25
   -0.0000000000000004645,
Packit 67cb25
   -0.0000000000000001917,
Packit 67cb25
   -0.0000000000000000794,
Packit 67cb25
   -0.0000000000000000330
Packit 67cb25
};
Packit 67cb25
static cheb_series an22_cs = {
Packit 67cb25
  an22_data,
Packit 67cb25
  32,
Packit 67cb25
  -1, 1,
Packit 67cb25
  18
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for an21 on the interval -1.25000e-01 to -1.56250e-02
Packit 67cb25
                                        with weighted error   3.43e-17
Packit 67cb25
                                         log weighted error  16.47
Packit 67cb25
                               significant figures required  14.48
Packit 67cb25
                                    decimal places required  17.16
Packit 67cb25
*/
Packit 67cb25
static double an21_data[24] = {
Packit 67cb25
    0.0198313155263169394,
Packit 67cb25
   -0.0029376249067087533,
Packit 67cb25
   -0.0001136260695958196,
Packit 67cb25
   -0.0000100554451087156,
Packit 67cb25
   -0.0000013048787116563,
Packit 67cb25
   -0.0000002123881993151,
Packit 67cb25
   -0.0000000402270833384,
Packit 67cb25
   -0.0000000084996745953,
Packit 67cb25
   -0.0000000019514839426,
Packit 67cb25
   -0.0000000004783865344,
Packit 67cb25
   -0.0000000001236733992,
Packit 67cb25
   -0.0000000000334137486,
Packit 67cb25
   -0.0000000000093702824,
Packit 67cb25
   -0.0000000000027130128,
Packit 67cb25
   -0.0000000000008075954,
Packit 67cb25
   -0.0000000000002463214,
Packit 67cb25
   -0.0000000000000767656,
Packit 67cb25
   -0.0000000000000243883,
Packit 67cb25
   -0.0000000000000078831,
Packit 67cb25
   -0.0000000000000025882,
Packit 67cb25
   -0.0000000000000008619,
Packit 67cb25
   -0.0000000000000002908,
Packit 67cb25
   -0.0000000000000000993,
Packit 67cb25
   -0.0000000000000000343
Packit 67cb25
};
Packit 67cb25
static cheb_series an21_cs = {
Packit 67cb25
  an21_data,
Packit 67cb25
  23,
Packit 67cb25
  -1, 1,
Packit 67cb25
  12
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for an20 on the interval -1.56250e-02 to  0.00000e+00
Packit 67cb25
                                        with weighted error   4.41e-17
Packit 67cb25
                                         log weighted error  16.36
Packit 67cb25
                               significant figures required  14.16
Packit 67cb25
                                    decimal places required  16.96
Packit 67cb25
*/
Packit 67cb25
static double an20_data[16] = {
Packit 67cb25
    0.0126732217145738027,
Packit 67cb25
   -0.0005212847072615621,
Packit 67cb25
   -0.0000052672111140370,
Packit 67cb25
   -0.0000001628202185026,
Packit 67cb25
   -0.0000000090991442687,
Packit 67cb25
   -0.0000000007438647126,
Packit 67cb25
   -0.0000000000795494752,
Packit 67cb25
   -0.0000000000104050944,
Packit 67cb25
   -0.0000000000015932426,
Packit 67cb25
   -0.0000000000002770648,
Packit 67cb25
   -0.0000000000000535343,
Packit 67cb25
   -0.0000000000000113062,
Packit 67cb25
   -0.0000000000000025772,
Packit 67cb25
   -0.0000000000000006278,
Packit 67cb25
   -0.0000000000000001621,
Packit 67cb25
   -0.0000000000000000441
Packit 67cb25
};
Packit 67cb25
static cheb_series an20_cs = {
Packit 67cb25
  an20_data,
Packit 67cb25
  15,
Packit 67cb25
  -1, 1,
Packit 67cb25
  8
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for aph2 on the interval -1.00000e+00 to -1.25000e-01
Packit 67cb25
                                        with weighted error   2.94e-17
Packit 67cb25
                                         log weighted error  16.53
Packit 67cb25
                               significant figures required  15.58
Packit 67cb25
                                    decimal places required  17.28
Packit 67cb25
*/
Packit 67cb25
static double aph2_data[32] = {
Packit 67cb25
   -0.2057088719781465107,
Packit 67cb25
    0.0422196961357771922,
Packit 67cb25
    0.0020482560511207275,
Packit 67cb25
    0.0002607800735165006,
Packit 67cb25
    0.0000474824268004729,
Packit 67cb25
    0.0000105102756431612,
Packit 67cb25
    0.0000026353534014668,
Packit 67cb25
    0.0000007208824863499,
Packit 67cb25
    0.0000002103236664473,
Packit 67cb25
    0.0000000644975634555,
Packit 67cb25
    0.0000000205802377264,
Packit 67cb25
    0.0000000067836273921,
Packit 67cb25
    0.0000000022974015284,
Packit 67cb25
    0.0000000007961306765,
Packit 67cb25
    0.0000000002813860610,
Packit 67cb25
    0.0000000001011749057,
Packit 67cb25
    0.0000000000369306738,
Packit 67cb25
    0.0000000000136615066,
Packit 67cb25
    0.0000000000051142751,
Packit 67cb25
    0.0000000000019351689,
Packit 67cb25
    0.0000000000007393607,
Packit 67cb25
    0.0000000000002849792,
Packit 67cb25
    0.0000000000001107281,
Packit 67cb25
    0.0000000000000433412,
Packit 67cb25
    0.0000000000000170801,
Packit 67cb25
    0.0000000000000067733,
Packit 67cb25
    0.0000000000000027017,
Packit 67cb25
    0.0000000000000010835,
Packit 67cb25
    0.0000000000000004367,
Packit 67cb25
    0.0000000000000001769,
Packit 67cb25
    0.0000000000000000719,
Packit 67cb25
    0.0000000000000000294
Packit 67cb25
};
Packit 67cb25
static cheb_series aph2_cs = {
Packit 67cb25
  aph2_data,
Packit 67cb25
  31,
Packit 67cb25
  -1, 1,
Packit 67cb25
  16
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for aph1 on the interval -1.25000e-01 to -1.56250e-02
Packit 67cb25
                                        with weighted error   6.38e-17
Packit 67cb25
                                         log weighted error  16.20
Packit 67cb25
                               significant figures required  14.91
Packit 67cb25
                                    decimal places required  16.87
Packit 67cb25
*/
Packit 67cb25
static double aph1_data[22] = {
Packit 67cb25
  -0.1024172908077571694,
Packit 67cb25
   0.0071697275146591248,
Packit 67cb25
   0.0001209959363122329,
Packit 67cb25
   0.0000073361512841220,
Packit 67cb25
   0.0000007535382954272,
Packit 67cb25
   0.0000001041478171741,
Packit 67cb25
   0.0000000174358728519,
Packit 67cb25
   0.0000000033399795033,
Packit 67cb25
   0.0000000007073075174,
Packit 67cb25
   0.0000000001619187515,
Packit 67cb25
   0.0000000000394539982,
Packit 67cb25
   0.0000000000101192282,
Packit 67cb25
   0.0000000000027092778,
Packit 67cb25
   0.0000000000007523806,
Packit 67cb25
   0.0000000000002156369,
Packit 67cb25
   0.0000000000000635283,
Packit 67cb25
   0.0000000000000191757,
Packit 67cb25
   0.0000000000000059143,
Packit 67cb25
   0.0000000000000018597,
Packit 67cb25
   0.0000000000000005950,
Packit 67cb25
   0.0000000000000001934,
Packit 67cb25
   0.0000000000000000638
Packit 67cb25
};
Packit 67cb25
static cheb_series aph1_cs = {
Packit 67cb25
  aph1_data,
Packit 67cb25
  21,
Packit 67cb25
  -1, 1,
Packit 67cb25
  10
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/*
Packit 67cb25
 series for aph0 on the interval -1.56250e-02 to  0.00000e+00
Packit 67cb25
                                        with weighted error   2.29e-17
Packit 67cb25
                                         log weighted error  16.64
Packit 67cb25
                               significant figures required  15.27
Packit 67cb25
                                    decimal places required  17.23
Packit 67cb25
*/
Packit 67cb25
static double aph0_data[15] = {
Packit 67cb25
 -0.0855849241130933257,
Packit 67cb25
  0.0011214378867065261,
Packit 67cb25
  0.0000042721029353664,
Packit 67cb25
  0.0000000817607381483,
Packit 67cb25
  0.0000000033907645000,
Packit 67cb25
  0.0000000002253264423,
Packit 67cb25
  0.0000000000206284209,
Packit 67cb25
  0.0000000000023858763,
Packit 67cb25
  0.0000000000003301618,
Packit 67cb25
  0.0000000000000527010,
Packit 67cb25
  0.0000000000000094555,
Packit 67cb25
  0.0000000000000018709,
Packit 67cb25
  0.0000000000000004024,
Packit 67cb25
  0.0000000000000000930,
Packit 67cb25
  0.0000000000000000229
Packit 67cb25
};
Packit 67cb25
static cheb_series aph0_cs = {
Packit 67cb25
  aph0_data,
Packit 67cb25
  14,
Packit 67cb25
  -1, 1,
Packit 67cb25
  7
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
static
Packit 67cb25
int
Packit 67cb25
airy_deriv_mod_phase(const double x, gsl_mode_t mode,
Packit 67cb25
                     gsl_sf_result * ampl, gsl_sf_result * phi)
Packit 67cb25
{
Packit 67cb25
  const double pi34 = 2.356194490192344928847;
Packit 67cb25
  gsl_sf_result result_a;
Packit 67cb25
  gsl_sf_result result_p;
Packit 67cb25
  double a, p;
Packit 67cb25
  double sqx;
Packit 67cb25
Packit 67cb25
  if(x <= -4.0) {
Packit 67cb25
    double z = 128.0/(x*x*x) + 1.0;
Packit 67cb25
    cheb_eval_mode_e(&an20_cs, z, mode, &result_a);
Packit 67cb25
    cheb_eval_mode_e(&aph0_cs, z, mode, &result_p);
Packit 67cb25
  }
Packit 67cb25
  else if(x <= -2.0) {
Packit 67cb25
    double z = (128.0/(x*x*x) + 9.0) / 7.0;
Packit 67cb25
    cheb_eval_mode_e(&an21_cs, z, mode, &result_a);
Packit 67cb25
    cheb_eval_mode_e(&aph1_cs, z, mode, &result_p);
Packit 67cb25
  }
Packit 67cb25
  else if(x <= -1.0) {
Packit 67cb25
    double z = (16.0/(x*x*x) + 9.0) / 7.0;
Packit 67cb25
    cheb_eval_mode_e(&an22_cs, z, mode, &result_a);
Packit 67cb25
    cheb_eval_mode_e(&aph2_cs, z, mode, &result_p);
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    ampl->val = 0.0;
Packit 67cb25
    ampl->err = 0.0;
Packit 67cb25
    phi->val  = 0.0;
Packit 67cb25
    phi->err  = 0.0;
Packit 67cb25
    GSL_ERROR ("x is greater than 1.0", GSL_EDOM);
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  a =  0.3125 + result_a.val;
Packit 67cb25
  p = -0.625  + result_p.val;
Packit 67cb25
 
Packit 67cb25
  sqx = sqrt(-x);
Packit 67cb25
Packit 67cb25
  ampl->val = sqrt(a * sqx);
Packit 67cb25
  ampl->err = fabs(ampl->val) * (GSL_DBL_EPSILON + fabs(result_a.err/result_a.val));
Packit 67cb25
  phi->val  = pi34 - x * sqx * p;
Packit 67cb25
  phi->err = fabs(phi->val) * (GSL_DBL_EPSILON + fabs(result_p.err/result_p.val));
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_airy_Ai_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < -1.0) {
Packit 67cb25
    gsl_sf_result a;
Packit 67cb25
    gsl_sf_result p;
Packit 67cb25
    int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
Packit 67cb25
    double c    = cos(p.val);
Packit 67cb25
    result->val  = a.val * c;
Packit 67cb25
    result->err  = fabs(result->val * p.err) + fabs(c * a.err);
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return status_ap;
Packit 67cb25
  }
Packit 67cb25
  else if(x <= 1.0) {
Packit 67cb25
    const double x3 = x*x*x;
Packit 67cb25
    const double x2 = x*x;
Packit 67cb25
    gsl_sf_result result_c0;
Packit 67cb25
    gsl_sf_result result_c1;
Packit 67cb25
    cheb_eval_mode_e(&aif_cs, x3, mode, &result_c0);
Packit 67cb25
    cheb_eval_mode_e(&aig_cs, x3, mode, &result_c1);
Packit 67cb25
Packit 67cb25
    result->val  = (x2*(0.125 + result_c0.val) - result_c1.val) - 0.25;
Packit 67cb25
    result->err  = fabs(x2*result_c0.val) + result_c1.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
Packit 67cb25
    if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
Packit 67cb25
      /* scale only if x is positive */
Packit 67cb25
      double s = exp(2.0*x*sqrt(x)/3.0);
Packit 67cb25
      result->val *= s;
Packit 67cb25
      result->err *= s;
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x <= 4.0) {
Packit 67cb25
    const double sqrtx = sqrt(x);
Packit 67cb25
    const double z = (16.0/(x*sqrtx) - 9.0)/7.0;
Packit 67cb25
    const double s = sqrt(sqrtx);
Packit 67cb25
    gsl_sf_result result_c0;
Packit 67cb25
    cheb_eval_mode_e(&aip1_cs, z, mode, &result_c0);
Packit 67cb25
    result->val  = -(0.28125 + result_c0.val) * s;
Packit 67cb25
    result->err  = result_c0.err * s;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double sqrtx = sqrt(x);
Packit 67cb25
    const double z = 16.0/(x*sqrtx) - 1.0;
Packit 67cb25
    const double s = sqrt(sqrtx);
Packit 67cb25
    gsl_sf_result result_c0;
Packit 67cb25
    cheb_eval_mode_e(&aip2_cs, z, mode, &result_c0);
Packit 67cb25
    result->val  = -(0.28125 + result_c0.val) * s;
Packit 67cb25
    result->err  = result_c0.err * s;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_airy_Ai_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < -1.0) {
Packit 67cb25
    gsl_sf_result a;
Packit 67cb25
    gsl_sf_result p;
Packit 67cb25
    int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
Packit 67cb25
    double c    = cos(p.val);
Packit 67cb25
    result->val  = a.val * c;
Packit 67cb25
    result->err  = fabs(result->val * p.err) + fabs(c * a.err);
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return status_ap;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 1.0) {
Packit 67cb25
    const double x3 = x*x*x;
Packit 67cb25
    gsl_sf_result result_c1;
Packit 67cb25
    gsl_sf_result result_c2;
Packit 67cb25
    cheb_eval_mode_e(&aif_cs, x3, mode, &result_c1);
Packit 67cb25
    cheb_eval_mode_e(&aig_cs, x3, mode, &result_c2);
Packit 67cb25
    result->val  = (x*x*(0.125 + result_c1.val) - result_c2.val) - 0.25;
Packit 67cb25
    result->err  = fabs(x*x*result_c1.err) + result_c2.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x*x*x < 9.0/4.0 * GSL_LOG_DBL_MIN*GSL_LOG_DBL_MIN) {
Packit 67cb25
    gsl_sf_result result_aps;
Packit 67cb25
    const double arg = -2.0*x*sqrt(x)/3.0;
Packit 67cb25
    const int stat_a = gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result_aps);
Packit 67cb25
    const int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
Packit 67cb25
                                                result_aps.val, result_aps.err,
Packit 67cb25
                                                result);
Packit 67cb25
    return GSL_ERROR_SELECT_2(stat_e, stat_a);
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    UNDERFLOW_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_airy_Bi_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  const double atr =  8.7506905708484345;   /* 16./(sqrt(8)-1) */
Packit 67cb25
  const double btr = -2.0938363213560543;   /* -(sqrt(8)+1)/(sqrt(8)-1) */
Packit 67cb25
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < -1.0) {
Packit 67cb25
    gsl_sf_result a;
Packit 67cb25
    gsl_sf_result p;
Packit 67cb25
    int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
Packit 67cb25
    double s     = sin(p.val);
Packit 67cb25
    result->val  = a.val * s;
Packit 67cb25
    result->err  = fabs(result->val * p.err) + fabs(s * a.err);
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return status_ap;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 1.0) {
Packit 67cb25
    const double x3 = x*x*x;
Packit 67cb25
    const double x2 = x*x;
Packit 67cb25
    gsl_sf_result result_c1;
Packit 67cb25
    gsl_sf_result result_c2;
Packit 67cb25
    cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
Packit 67cb25
    cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
Packit 67cb25
    result->val  = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
Packit 67cb25
    result->err  = x2 * result_c1.err + result_c2.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
Packit 67cb25
    if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
Packit 67cb25
      /* scale only if x is positive */
Packit 67cb25
      const double s = exp(-2.0*x*sqrt(x)/3.0);
Packit 67cb25
      result->val *= s;
Packit 67cb25
      result->err *= s;
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 2.0) {
Packit 67cb25
    const double z = (2.0*x*x*x - 9.0) / 7.0;
Packit 67cb25
    const double s = exp(-2.0*x*sqrt(x)/3.0);
Packit 67cb25
    gsl_sf_result result_c0;
Packit 67cb25
    gsl_sf_result result_c1;
Packit 67cb25
    cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);
Packit 67cb25
    cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);
Packit 67cb25
    result->val  = s * (x*x * (0.25 + result_c0.val) + 0.5 + result_c1.val);
Packit 67cb25
    result->err  = s * (x*x * result_c0.err + result_c1.err);
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 4.0) {
Packit 67cb25
    const double sqrtx = sqrt(x);
Packit 67cb25
    const double z = atr/(x*sqrtx) + btr;
Packit 67cb25
    const double s = sqrt(sqrtx);
Packit 67cb25
    gsl_sf_result result_c0;
Packit 67cb25
    cheb_eval_mode_e(&bip1_cs, z, mode, &result_c0);
Packit 67cb25
    result->val  = s * (0.625 + result_c0.val);
Packit 67cb25
    result->err  = s * result_c0.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double sqrtx = sqrt(x);
Packit 67cb25
    const double z = 16.0/(x*sqrtx) - 1.0;
Packit 67cb25
    const double s = sqrt(sqrtx);
Packit 67cb25
    gsl_sf_result result_c0;
Packit 67cb25
    cheb_eval_mode_e(&bip2_cs, z, mode, &result_c0);
Packit 67cb25
    result->val  = s * (0.625 + result_c0.val);
Packit 67cb25
    result->err  = s * result_c0.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_airy_Bi_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(x < -1.0) {
Packit 67cb25
    gsl_sf_result a;
Packit 67cb25
    gsl_sf_result p;
Packit 67cb25
    int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
Packit 67cb25
    double s    = sin(p.val);
Packit 67cb25
    result->val  = a.val * s;
Packit 67cb25
    result->err  = fabs(result->val * p.err) + fabs(s * a.err);
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return status_ap;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 1.0) {
Packit 67cb25
    const double x3 = x*x*x;
Packit 67cb25
    const double x2 = x*x;
Packit 67cb25
    gsl_sf_result result_c1;
Packit 67cb25
    gsl_sf_result result_c2;
Packit 67cb25
    cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
Packit 67cb25
    cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
Packit 67cb25
    result->val  = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
Packit 67cb25
    result->err  = x2 * result_c1.err + result_c2.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < 2.0) {
Packit 67cb25
    const double z = (2.0*x*x*x - 9.0) / 7.0;
Packit 67cb25
    gsl_sf_result result_c1;
Packit 67cb25
    gsl_sf_result result_c2;
Packit 67cb25
    cheb_eval_mode_e(&bif2_cs, z, mode, &result_c1);
Packit 67cb25
    cheb_eval_mode_e(&big2_cs, z, mode, &result_c2);
Packit 67cb25
    result->val  = x*x * (result_c1.val + 0.25) + result_c2.val + 0.5;
Packit 67cb25
    result->err  = x*x * result_c1.err + result_c2.err;
Packit 67cb25
    result->err += GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(x < GSL_ROOT3_DBL_MAX*GSL_ROOT3_DBL_MAX) {
Packit 67cb25
    gsl_sf_result result_bps;
Packit 67cb25
    const double arg = 2.0*(x*sqrt(x)/3.0);
Packit 67cb25
    int stat_b = gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result_bps);
Packit 67cb25
    int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
Packit 67cb25
                                          result_bps.val, result_bps.err,
Packit 67cb25
                                          result);
Packit 67cb25
    return GSL_ERROR_SELECT_2(stat_e, stat_b);
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    OVERFLOW_ERROR(result);
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_airy_Ai_deriv_scaled(const double x, gsl_mode_t mode)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_airy_Ai_deriv(const double x, gsl_mode_t mode)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_airy_Ai_deriv_e(x, mode, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_airy_Bi_deriv_scaled(const double x, gsl_mode_t mode)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_airy_Bi_deriv(const double x, gsl_mode_t mode)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_airy_Bi_deriv_e(x, mode, &result));
Packit 67cb25
}