summaryrefslogtreecommitdiff
path: root/gsl-1.9/specfunc/airy_der.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/specfunc/airy_der.c')
-rw-r--r--gsl-1.9/specfunc/airy_der.c888
1 files changed, 888 insertions, 0 deletions
diff --git a/gsl-1.9/specfunc/airy_der.c b/gsl-1.9/specfunc/airy_der.c
new file mode 100644
index 0000000..3830875
--- /dev/null
+++ b/gsl-1.9/specfunc/airy_der.c
@@ -0,0 +1,888 @@
+/* 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));
+}