/* airy.c
*
* Airy function
*
*
*
* SYNOPSIS :
*
* float x , ai , aip , bi , bip ;
* int airyf ( ) ;
*
* airyf ( x , _ & ai , _ & aip , _ & bi , _ & bip ) ;
*
*
*
* DESCRIPTION :
*
* Solution of the differential equation
*
* y " ( x ) = xy .
*
* The function returns the two independent solutions Ai , Bi
* and their first derivatives Ai ' ( x ) , Bi ' ( x ) .
*
* Evaluation is by power series summation for small x ,
* by rational minimax approximations for large x .
*
*
*
* ACCURACY :
* Error criterion is absolute when function < = 1 , relative
* when function > 1 , except * denotes relative error criterion .
* For large negative x , the absolute error increases as x ^ 1 . 5 .
* For large positive x , the relative error increases as x ^ 1 . 5 .
*
* Arithmetic domain function # trials peak rms
* IEEE - 10 , 0 Ai 50000 7 . 0 e - 7 1 . 2 e - 7
* IEEE 0 , 10 Ai 50000 9 . 9 e - 6 * 6 . 8 e - 7 *
* IEEE - 10 , 0 Ai ' 50000 2 . 4 e - 6 3 . 5 e - 7
* IEEE 0 , 10 Ai ' 50000 8 . 7 e - 6 * 6 . 2 e - 7 *
* IEEE - 10 , 10 Bi 100000 2 . 2 e - 6 2 . 6 e - 7
* IEEE - 10 , 10 Bi ' 50000 2 . 2 e - 6 3 . 5 e - 7
*
*/
/* airy.c */
/*
Cephes Math Library Release 2 . 2 : June , 1992
Copyright 1984 , 1987 , 1989 , 1992 by Stephen L . Moshier
Direct inquiries to 30 Frost Street , Cambridge , MA 02140
*/
#include "mconf.h"
static float c1 = 0 .35502805388781723926 ;
static float c2 = 0 .258819403792806798405 ;
static float sqrt3 = 1 .732050807568877293527 ;
static float sqpii = 5 .64189583547756286948 E-1 ;
extern float PIF;
extern float MAXNUMF, MACHEPF;
#define MAXAIRY 25 .77
/* Note, these expansions are for double precision accuracy;
* they have not yet been redesigned for single precision .
*/
static float AN[8 ] = {
3 .46538101525629032477 e-1 ,
1 .20075952739645805542 e1,
7 .62796053615234516538 e1,
1 .68089224934630576269 e2,
1 .59756391350164413639 e2,
7 .05360906840444183113 e1,
1 .40264691163389668864 e1,
9 .99999999999999995305 e-1 ,
};
static float AD[8 ] = {
5 .67594532638770212846 e-1 ,
1 .47562562584847203173 e1,
8 .45138970141474626562 e1,
1 .77318088145400459522 e2,
1 .64234692871529701831 e2,
7 .14778400825575695274 e1,
1 .40959135607834029598 e1,
1 .00000000000000000470 e0,
};
static float APN[8 ] = {
6 .13759184814035759225 e-1 ,
1 .47454670787755323881 e1,
8 .20584123476060982430 e1,
1 .71184781360976385540 e2,
1 .59317847137141783523 e2,
6 .99778599330103016170 e1,
1 .39470856980481566958 e1,
1 .00000000000000000550 e0,
};
static float APD[8 ] = {
3 .34203677749736953049 e-1 ,
1 .11810297306158156705 e1,
7 .11727352147859965283 e1,
1 .58778084372838313640 e2,
1 .53206427475809220834 e2,
6 .86752304592780337944 e1,
1 .38498634758259442477 e1,
9 .99999999999999994502 e-1 ,
};
static float BN16[5 ] = {
-2 .53240795869364152689 e-1 ,
5 .75285167332467384228 e-1 ,
-3 .29907036873225371650 e-1 ,
6 .44404068948199951727 e-2 ,
-3 .82519546641336734394 e-3 ,
};
static float BD16[5 ] = {
/* 1.00000000000000000000e0,*/
-7 .15685095054035237902 e0,
1 .06039580715664694291 e1,
-5 .23246636471251500874 e0,
9 .57395864378383833152 e-1 ,
-5 .50828147163549611107 e-2 ,
};
static float BPPN[5 ] = {
4 .65461162774651610328 e-1 ,
-1 .08992173800493920734 e0,
6 .38800117371827987759 e-1 ,
-1 .26844349553102907034 e-1 ,
7 .62487844342109852105 e-3 ,
};
static float BPPD[5 ] = {
/* 1.00000000000000000000e0,*/
-8 .70622787633159124240 e0,
1 .38993162704553213172 e1,
-7 .14116144616431159572 e0,
1 .34008595960680518666 e0,
-7 .84273211323341930448 e-2 ,
};
static float AFN[9 ] = {
-1 .31696323418331795333 e-1 ,
-6 .26456544431912369773 e-1 ,
-6 .93158036036933542233 e-1 ,
-2 .79779981545119124951 e-1 ,
-4 .91900132609500318020 e-2 ,
-4 .06265923594885404393 e-3 ,
-1 .59276496239262096340 e-4 ,
-2 .77649108155232920844 e-6 ,
-1 .67787698489114633780 e-8 ,
};
static float AFD[9 ] = {
/* 1.00000000000000000000e0,*/
1 .33560420706553243746 e1,
3 .26825032795224613948 e1,
2 .67367040941499554804 e1,
9 .18707402907259625840 e0,
1 .47529146771666414581 e0,
1 .15687173795188044134 e-1 ,
4 .40291641615211203805 e-3 ,
7 .54720348287414296618 e-5 ,
4 .51850092970580378464 e-7 ,
};
static float AGN[11 ] = {
1 .97339932091685679179 e-2 ,
3 .91103029615688277255 e-1 ,
1 .06579897599595591108 e0,
9 .39169229816650230044 e-1 ,
3 .51465656105547619242 e-1 ,
6 .33888919628925490927 e-2 ,
5 .85804113048388458567 e-3 ,
2 .82851600836737019778 e-4 ,
6 .98793669997260967291 e-6 ,
8 .11789239554389293311 e-8 ,
3 .41551784765923618484 e-10 ,
};
static float AGD[10 ] = {
/* 1.00000000000000000000e0,*/
9 .30892908077441974853 e0,
1 .98352928718312140417 e1,
1 .55646628932864612953 e1,
5 .47686069422975497931 e0,
9 .54293611618961883998 e-1 ,
8 .64580826352392193095 e-2 ,
4 .12656523824222607191 e-3 ,
1 .01259085116509135510 e-4 ,
1 .17166733214413521882 e-6 ,
4 .91834570062930015649 e-9 ,
};
static float APFN[9 ] = {
1 .85365624022535566142 e-1 ,
8 .86712188052584095637 e-1 ,
9 .87391981747398547272 e-1 ,
4 .01241082318003734092 e-1 ,
7 .10304926289631174579 e-2 ,
5 .90618657995661810071 e-3 ,
2 .33051409401776799569 e-4 ,
4 .08718778289035454598 e-6 ,
2 .48379932900442457853 e-8 ,
};
static float APFD[9 ] = {
/* 1.00000000000000000000e0,*/
1 .47345854687502542552 e1,
3 .75423933435489594466 e1,
3 .14657751203046424330 e1,
1 .09969125207298778536 e1,
1 .78885054766999417817 e0,
1 .41733275753662636873 e-1 ,
5 .44066067017226003627 e-3 ,
9 .39421290654511171663 e-5 ,
5 .65978713036027009243 e-7 ,
};
static float APGN[11 ] = {
-3 .55615429033082288335 e-2 ,
-6 .37311518129435504426 e-1 ,
-1 .70856738884312371053 e0,
-1 .50221872117316635393 e0,
-5 .63606665822102676611 e-1 ,
-1 .02101031120216891789 e-1 ,
-9 .48396695961445269093 e-3 ,
-4 .60325307486780994357 e-4 ,
-1 .14300836484517375919 e-5 ,
-1 .33415518685547420648 e-7 ,
-5 .63803833958893494476 e-10 ,
};
static float APGD[11 ] = {
/* 1.00000000000000000000e0,*/
9 .85865801696130355144 e0,
2 .16401867356585941885 e1,
1 .73130776389749389525 e1,
6 .17872175280828766327 e0,
1 .08848694396321495475 e0,
9 .95005543440888479402 e-2 ,
4 .78468199683886610842 e-3 ,
1 .18159633322838625562 e-4 ,
1 .37480673554219441465 e-6 ,
5 .79912514929147598821 e-9 ,
};
#define fabsf(x) ( (x) < 0 ? -(x) : (x) )
#ifdef ANSIC
float polevlf(float , float *, int );
float p1evlf(float , float *, int );
float sinf(float ), cosf(float ), expf(float ), sqrtf(float );
int airyf( float xx, float *ai, float *aip, float *bi, float *bip )
#else
float polevlf(), p1evlf(), sinf(), cosf(), expf(), sqrtf();
int airyf( xx, ai, aip, bi, bip )
double xx;
float *ai, *aip, *bi, *bip;
#endif
{
float x, z, zz, t, f, g, uf, ug, k, zeta, theta;
int domflg;
x = xx;
domflg = 0 ;
if ( x > MAXAIRY )
{
*ai = 0 ;
*aip = 0 ;
*bi = MAXNUMF;
*bip = MAXNUMF;
return (-1 );
}
if ( x < -2 .09 )
{
domflg = 15 ;
t = sqrtf(-x);
zeta = -2 .0 * x * t / 3 .0 ;
t = sqrtf(t);
k = sqpii / t;
z = 1 .0 /zeta;
zz = z * z;
uf = 1 .0 + zz * polevlf( zz, AFN, 8 ) / p1evlf( zz, AFD, 9 );
ug = z * polevlf( zz, AGN, 10 ) / p1evlf( zz, AGD, 10 );
theta = zeta + 0 .25 * PIF;
f = sinf( theta );
g = cosf( theta );
*ai = k * (f * uf - g * ug);
*bi = k * (g * uf + f * ug);
uf = 1 .0 + zz * polevlf( zz, APFN, 8 ) / p1evlf( zz, APFD, 9 );
ug = z * polevlf( zz, APGN, 10 ) / p1evlf( zz, APGD, 10 );
k = sqpii * t;
*aip = -k * (g * uf + f * ug);
*bip = k * (f * uf - g * ug);
return (0 );
}
if ( x >= 2 .09 ) /* cbrt(9) */
{
domflg = 5 ;
t = sqrtf(x);
zeta = 2 .0 * x * t / 3 .0 ;
g = expf( zeta );
t = sqrtf(t);
k = 2 .0 * t * g;
z = 1 .0 /zeta;
f = polevlf( z, AN, 7 ) / polevlf( z, AD, 7 );
*ai = sqpii * f / k;
k = -0 .5 * sqpii * t / g;
f = polevlf( z, APN, 7 ) / polevlf( z, APD, 7 );
*aip = f * k;
if ( x > 8 .3203353 ) /* zeta > 16 */
{
f = z * polevlf( z, BN16, 4 ) / p1evlf( z, BD16, 5 );
k = sqpii * g;
*bi = k * (1 .0 + f) / t;
f = z * polevlf( z, BPPN, 4 ) / p1evlf( z, BPPD, 5 );
*bip = k * t * (1 .0 + f);
return (0 );
}
}
f = 1 .0 ;
g = x;
t = 1 .0 ;
uf = 1 .0 ;
ug = x;
k = 1 .0 ;
z = x * x * x;
while ( t > MACHEPF )
{
uf *= z;
k += 1 .0 ;
uf /=k;
ug *= z;
k += 1 .0 ;
ug /=k;
uf /=k;
f += uf;
k += 1 .0 ;
ug /=k;
g += ug;
t = fabsf(uf/f);
}
uf = c1 * f;
ug = c2 * g;
if ( (domflg & 1 ) == 0 )
*ai = uf - ug;
if ( (domflg & 2 ) == 0 )
*bi = sqrt3 * (uf + ug);
/* the deriviative of ai */
k = 4 .0 ;
uf = x * x/2 .0 ;
ug = z/3 .0 ;
f = uf;
g = 1 .0 + ug;
uf /= 3 .0 ;
t = 1 .0 ;
while ( t > MACHEPF )
{
uf *= z;
ug /=k;
k += 1 .0 ;
ug *= z;
uf /=k;
f += uf;
k += 1 .0 ;
ug /=k;
uf /=k;
g += ug;
k += 1 .0 ;
t = fabsf(ug/g);
}
uf = c1 * f;
ug = c2 * g;
if ( (domflg & 4 ) == 0 )
*aip = uf - ug;
if ( (domflg & 8 ) == 0 )
*bip = sqrt3 * (uf + ug);
return (0 );
}
Messung V0.5 in Prozent C=97 H=96 G=96
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-17)
¤
*© Formatika GbR, Deutschland