123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- /* k1.c
- *
- * Modified Bessel function, third kind, order one
- *
- *
- *
- * SYNOPSIS:
- *
- * double x, y, k1();
- *
- * y = k1( x );
- *
- *
- *
- * DESCRIPTION:
- *
- * Computes the modified Bessel function of the third kind
- * of order one of the argument.
- *
- * The range is partitioned into the two intervals [0,2] and
- * (2, infinity). Chebyshev polynomial expansions are employed
- * in each interval.
- *
- *
- *
- * ACCURACY:
- *
- * Relative error:
- * arithmetic domain # trials peak rms
- * DEC 0, 30 3300 8.9e-17 2.2e-17
- * IEEE 0, 30 30000 1.2e-15 1.6e-16
- *
- * ERROR MESSAGES:
- *
- * message condition value returned
- * k1 domain x <= 0 MAXNUM
- *
- */
- /* k1e.c
- *
- * Modified Bessel function, third kind, order one,
- * exponentially scaled
- *
- *
- *
- * SYNOPSIS:
- *
- * double x, y, k1e();
- *
- * y = k1e( x );
- *
- *
- *
- * DESCRIPTION:
- *
- * Returns exponentially scaled modified Bessel function
- * of the third kind of order one of the argument:
- *
- * k1e(x) = exp(x) * k1(x).
- *
- *
- *
- * ACCURACY:
- *
- * Relative error:
- * arithmetic domain # trials peak rms
- * IEEE 0, 30 30000 7.8e-16 1.2e-16
- * See k1().
- *
- */
- /*
- Cephes Math Library Release 2.8: June, 2000
- Copyright 1984, 1987, 2000 by Stephen L. Moshier
- */
- #include "mconf.h"
- /* Chebyshev coefficients for x(K1(x) - log(x/2) I1(x))
- * in the interval [0,2].
- *
- * lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1.
- */
- #ifdef UNK
- static double A[] = {-7.02386347938628759343E-18, -2.42744985051936593393E-15,
- -6.66690169419932900609E-13, -1.41148839263352776110E-10,
- -2.21338763073472585583E-8, -2.43340614156596823496E-6,
- -1.73028895751305206302E-4, -6.97572385963986435018E-3,
- -1.22611180822657148235E-1, -3.53155960776544875667E-1,
- 1.52530022733894777053E0};
- #endif
- #ifdef DEC
- static unsigned short A[] = {
- 0122001, 0110501, 0164746, 0151255, 0124056, 0165213, 0150034, 0147377,
- 0126073, 0124026, 0167207, 0001044, 0130033, 0030735, 0141061, 0033116,
- 0131676, 0020350, 0121341, 0107175, 0133443, 0046631, 0062031, 0070716,
- 0135065, 0067427, 0026435, 0164022, 0136344, 0112234, 0165752, 0006222,
- 0137373, 0015622, 0017016, 0155636, 0137664, 0150333, 0125730, 0067240,
- 0040303, 0036411, 0130200, 0043120};
- #endif
- #ifdef IBMPC
- static unsigned short A[] = {
- 0xda56, 0x3d3c, 0x3228, 0xbc60, 0x99e0, 0x7a03, 0xdd51, 0xbce5, 0xe045,
- 0xddd0, 0x7502, 0xbd67, 0x26ca, 0xb846, 0x663b, 0xbde3, 0x31d0, 0x145c,
- 0xc41d, 0xbe57, 0x2e3a, 0x2c83, 0x69b3, 0xbec4, 0xbd02, 0xe5a3, 0xade2,
- 0xbf26, 0x4192, 0x9d7d, 0x9293, 0xbf7c, 0xdb74, 0x43c1, 0x6372, 0xbfbf,
- 0x0dd4, 0x757b, 0x9a1b, 0xbfd6, 0x08ca, 0x3610, 0x67a1, 0x3ff8};
- #endif
- #ifdef MIEEE
- static unsigned short A[] = {
- 0xbc60, 0x3228, 0x3d3c, 0xda56, 0xbce5, 0xdd51, 0x7a03, 0x99e0, 0xbd67,
- 0x7502, 0xddd0, 0xe045, 0xbde3, 0x663b, 0xb846, 0x26ca, 0xbe57, 0xc41d,
- 0x145c, 0x31d0, 0xbec4, 0x69b3, 0x2c83, 0x2e3a, 0xbf26, 0xade2, 0xe5a3,
- 0xbd02, 0xbf7c, 0x9293, 0x9d7d, 0x4192, 0xbfbf, 0x6372, 0x43c1, 0xdb74,
- 0xbfd6, 0x9a1b, 0x757b, 0x0dd4, 0x3ff8, 0x67a1, 0x3610, 0x08ca};
- #endif
- /* Chebyshev coefficients for exp(x) sqrt(x) K1(x)
- * in the interval [2,infinity].
- *
- * lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2).
- */
- #ifdef UNK
- static double B[] = {-5.75674448366501715755E-18, 1.79405087314755922667E-17,
- -5.68946255844285935196E-17, 1.83809354436663880070E-16,
- -6.05704724837331885336E-16, 2.03870316562433424052E-15,
- -7.01983709041831346144E-15, 2.47715442448130437068E-14,
- -8.97670518232499435011E-14, 3.34841966607842919884E-13,
- -1.28917396095102890680E-12, 5.13963967348173025100E-12,
- -2.12996783842756842877E-11, 9.21831518760500529508E-11,
- -4.19035475934189648750E-10, 2.01504975519703286596E-9,
- -1.03457624656780970260E-8, 5.74108412545004946722E-8,
- -3.50196060308781257119E-7, 2.40648494783721712015E-6,
- -1.93619797416608296024E-5, 1.95215518471351631108E-4,
- -2.85781685962277938680E-3, 1.03923736576817238437E-1,
- 2.72062619048444266945E0};
- #endif
- #ifdef DEC
- static unsigned short B[] = {
- 0121724, 0061352, 0013041, 0150076, 0022245, 0074324, 0016172, 0173232,
- 0122603, 0030250, 0135670, 0165221, 0023123, 0165362, 0023561, 0060124,
- 0123456, 0112436, 0141654, 0073623, 0024022, 0163557, 0077564, 0006753,
- 0124374, 0165221, 0131014, 0026524, 0024737, 0017512, 0144250, 0175451,
- 0125312, 0021456, 0123136, 0076633, 0025674, 0077720, 0020125, 0102607,
- 0126265, 0067543, 0007744, 0043701, 0026664, 0152702, 0033002, 0074202,
- 0127273, 0055234, 0120016, 0071733, 0027712, 0133200, 0042441, 0075515,
- 0130346, 0057000, 0015456, 0074470, 0031012, 0074441, 0051636, 0111155,
- 0131461, 0136444, 0177417, 0002101, 0032166, 0111743, 0032176, 0021410,
- 0132674, 0001224, 0076555, 0027060, 0033441, 0077430, 0135226, 0106663,
- 0134242, 0065610, 0167155, 0113447, 0035114, 0131304, 0043664, 0102163,
- 0136073, 0045065, 0171465, 0122123, 0037324, 0152767, 0147401, 0017732,
- 0040456, 0017275, 0050061, 0062120,
- };
- #endif
- #ifdef IBMPC
- static unsigned short B[] = {
- 0x3a08, 0x42c4, 0x8c5d, 0xbc5a, 0x5ed3, 0x838f, 0xaf1a, 0x3c74, 0x1d52,
- 0x1777, 0x6615, 0xbc90, 0x2c0b, 0x44ee, 0x7d5e, 0x3caa, 0x8ef2, 0xd875,
- 0xd2a3, 0xbcc5, 0x81bd, 0xefee, 0x5ced, 0x3ce2, 0x85ab, 0x3641, 0x9d52,
- 0xbcff, 0x1f65, 0x5915, 0xe3e9, 0x3d1b, 0xcfb3, 0xd4cb, 0x4465, 0xbd39,
- 0xb0b1, 0x040a, 0x8ffa, 0x3d57, 0x88f8, 0x61fc, 0xadec, 0xbd76, 0x4f10,
- 0x46c0, 0x9ab8, 0x3d96, 0xce7b, 0x9401, 0x6b53, 0xbdb7, 0x2f6a, 0x08a4,
- 0x56d0, 0x3dd9, 0xcf27, 0x0365, 0xcbc0, 0xbdfc, 0xd24e, 0x2a73, 0x4f24,
- 0x3e21, 0xe088, 0x9fe1, 0x37a4, 0xbe46, 0xc461, 0x668f, 0xd27c, 0x3e6e,
- 0xa5c6, 0x8fad, 0x8052, 0xbe97, 0xd1b6, 0x1752, 0x2fe3, 0x3ec4, 0xb2e5,
- 0x1dcd, 0x4d71, 0xbef4, 0x908e, 0x88f6, 0x9658, 0x3f29, 0xb48a, 0xbe66,
- 0x6946, 0xbf67, 0x23fb, 0xf9e0, 0x9abe, 0x3fba, 0x2c8a, 0xaa06, 0xc3d7,
- 0x4005};
- #endif
- #ifdef MIEEE
- static unsigned short B[] = {
- 0xbc5a, 0x8c5d, 0x42c4, 0x3a08, 0x3c74, 0xaf1a, 0x838f, 0x5ed3, 0xbc90,
- 0x6615, 0x1777, 0x1d52, 0x3caa, 0x7d5e, 0x44ee, 0x2c0b, 0xbcc5, 0xd2a3,
- 0xd875, 0x8ef2, 0x3ce2, 0x5ced, 0xefee, 0x81bd, 0xbcff, 0x9d52, 0x3641,
- 0x85ab, 0x3d1b, 0xe3e9, 0x5915, 0x1f65, 0xbd39, 0x4465, 0xd4cb, 0xcfb3,
- 0x3d57, 0x8ffa, 0x040a, 0xb0b1, 0xbd76, 0xadec, 0x61fc, 0x88f8, 0x3d96,
- 0x9ab8, 0x46c0, 0x4f10, 0xbdb7, 0x6b53, 0x9401, 0xce7b, 0x3dd9, 0x56d0,
- 0x08a4, 0x2f6a, 0xbdfc, 0xcbc0, 0x0365, 0xcf27, 0x3e21, 0x4f24, 0x2a73,
- 0xd24e, 0xbe46, 0x37a4, 0x9fe1, 0xe088, 0x3e6e, 0xd27c, 0x668f, 0xc461,
- 0xbe97, 0x8052, 0x8fad, 0xa5c6, 0x3ec4, 0x2fe3, 0x1752, 0xd1b6, 0xbef4,
- 0x4d71, 0x1dcd, 0xb2e5, 0x3f29, 0x9658, 0x88f6, 0x908e, 0xbf67, 0x6946,
- 0xbe66, 0xb48a, 0x3fba, 0x9abe, 0xf9e0, 0x23fb, 0x4005, 0xc3d7, 0xaa06,
- 0x2c8a};
- #endif
- #ifdef ANSIPROT
- extern double chbevl(double, void *, int);
- extern double exp(double);
- extern double i1(double);
- extern double log(double);
- extern double sqrt(double);
- #else
- double chbevl(), exp(), i1(), log(), sqrt();
- #endif
- extern double PI;
- extern double MINLOG, MAXNUM;
- double k1(x) double x;
- {
- double y, z;
- z = 0.5 * x;
- if (z <= 0.0) {
- mtherr("k1", DOMAIN);
- return (MAXNUM);
- }
- if (x <= 2.0) {
- y = x * x - 2.0;
- y = log(z) * i1(x) + chbevl(y, A, 11) / x;
- return (y);
- }
- return (exp(-x) * chbevl(8.0 / x - 2.0, B, 25) / sqrt(x));
- }
- double k1e(x) double x;
- {
- double y;
- if (x <= 0.0) {
- mtherr("k1e", DOMAIN);
- return (MAXNUM);
- }
- if (x <= 2.0) {
- y = x * x - 2.0;
- y = log(0.5 * x) * i1(x) + chbevl(y, A, 11) / x;
- return (y * exp(x));
- }
- return (chbevl(8.0 / x - 2.0, B, 25) / sqrt(x));
- }
|