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