/* ei.c * * Exponential integral * * * SYNOPSIS: * * double x, y, ei(); * * y = ei( x ); * * * * DESCRIPTION: * * x * - t * | | e * Ei(x) = -|- --- dt . * | | t * - * -inf * * Not defined for x <= 0. * See also expn.c. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0,100 50000 8.6e-16 1.3e-16 * */ /* Cephes Math Library Release 2.8: May, 1999 Copyright 1999 by Stephen L. Moshier */ #include "mconf.h" #ifdef ANSIPROT extern double log(double); extern double exp(double); extern double polevl(double, void *, int); extern double p1evl(double, void *, int); #else extern double log(), exp(), polevl(), p1evl(); #endif #define EUL 5.772156649015328606065e-1 /* 0 < x <= 2 Ei(x) - EUL - ln(x) = x A(x)/B(x) Theoretical peak relative error 9.73e-18 */ #if UNK static double A[6] = { -5.350447357812542947283E0, 2.185049168816613393830E2, -4.176572384826693777058E3, 5.541176756393557601232E4, -3.313381331178144034309E5, 1.592627163384945414220E6, }; static double B[6] = { /* 1.000000000000000000000E0, */ -5.250547959112862969197E1, 1.259616186786790571525E3, -1.756549581973534652631E4, 1.493062117002725991967E5, -7.294949239640527645655E5, 1.592627163384945429726E6, }; #endif #if DEC static short A[24] = { 0140653, 0033335, 0060230, 0144217, 0042132, 0100502, 0035625, 0167413, 0143202, 0102224, 0037176, 0175403, 0044130, 0071704, 0077421, 0170343, 0144641, 0144504, 0041200, 0045154, 0045302, 0064631, 0047234, 0142052, }; static short B[24] = { /* 0040200,0000000,0000000,0000000, */ 0141522, 0002634, 0070442, 0142614, 0042635, 0071667, 0146532, 0027705, 0143611, 0035375, 0156025, 0114015, 0044421, 0147215, 0106177, 0046330, 0145062, 0014556, 0144216, 0103725, 0045302, 0064631, 0047234, 0142052, }; #endif #if IBMPC static short A[24] = { 0x1912, 0xac13, 0x66db, 0xc015, 0xbde1, 0x4772, 0x5028, 0x406b, 0xdf60, 0x87cf, 0x5092, 0xc0b0, 0x3e1c, 0x8fe2, 0x0e78, 0x40eb, 0x094e, 0x8850, 0x3928, 0xc114, 0x9885, 0x29d3, 0x4d33, 0x4138, }; static short B[24] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0x58b1, 0x8e24, 0x40b3, 0xc04a, 0x45f9, 0xf9ab, 0xae76, 0x4093, 0xb302, 0xbb82, 0x275f, 0xc0d1, 0xe99b, 0xb18f, 0x39d1, 0x4102, 0xd0fb, 0xd911, 0x432d, 0xc126, 0x9885, 0x29d3, 0x4d33, 0x4138, }; #endif #if MIEEE static short A[24] = { 0xc015, 0x66db, 0xac13, 0x1912, 0x406b, 0x5028, 0x4772, 0xbde1, 0xc0b0, 0x5092, 0x87cf, 0xdf60, 0x40eb, 0x0e78, 0x8fe2, 0x3e1c, 0xc114, 0x3928, 0x8850, 0x094e, 0x4138, 0x4d33, 0x29d3, 0x9885, }; static short B[24] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xc04a, 0x40b3, 0x8e24, 0x58b1, 0x4093, 0xae76, 0xf9ab, 0x45f9, 0xc0d1, 0x275f, 0xbb82, 0xb302, 0x4102, 0x39d1, 0xb18f, 0xe99b, 0xc126, 0x432d, 0xd911, 0xd0fb, 0x4138, 0x4d33, 0x29d3, 0x9885, }; #endif #if 0 /* 0 < x <= 4 Ei(x) - EUL - ln(x) = x A(x)/B(x) Theoretical peak relative error 4.75e-17 */ #if UNK static double A[7] = { -6.831869820732773831942E0, 2.920190530726774500309E2, -1.195883839286649567993E4, 1.761045255472548975666E5, -2.623034438354006526979E6, 1.472430336917880803157E7, -8.205359388213261174960E7, }; static double B[7] = { /* 1.000000000000000000000E0, */ -7.731946237840033971071E1, 2.751808700543578450827E3, -5.829268609072186897994E4, 7.916610857961870631379E5, -6.873926904825733094076E6, 3.523770183971164032710E7, -8.205359388213260785363E7, }; #endif #if DEC static short A[28] = { 0140732,0117255,0072522,0071743, 0042222,0001160,0052302,0002334, 0143472,0155532,0101650,0155462, 0044453,0175041,0121220,0172022, 0145440,0014351,0140337,0157550, 0046140,0126317,0057202,0100233, 0146634,0100473,0036072,0067054, }; static short B[28] = { /* 0040200,0000000,0000000,0000000, */ 0141632,0121620,0111247,0010115, 0043053,0176360,0067773,0027324, 0144143,0132257,0121644,0036204, 0045101,0043321,0057553,0151231, 0145721,0143215,0147505,0050610, 0046406,0065721,0072675,0152744, 0146634,0100473,0036072,0067052, }; #endif #if IBMPC static short A[28] = { 0x4e7c,0xaeaa,0x53d5,0xc01b, 0x409b,0x0a98,0x404e,0x4072, 0x1b66,0x5075,0x5b6b,0xc0c7, 0x1e82,0x3452,0x7f44,0x4105, 0xfbed,0x381b,0x031d,0xc144, 0x5013,0xebd0,0x1599,0x416c, 0x4dc5,0x6787,0x9027,0xc193, }; static short B[28] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xe20a,0x1254,0x5472,0xc053, 0x65db,0x0dff,0x7f9e,0x40a5, 0x8791,0xf474,0x7695,0xc0ec, 0x7a53,0x2bed,0x28da,0x4128, 0xaa31,0xb9e8,0x38d1,0xc15a, 0xbabd,0x2eb7,0xcd7a,0x4180, 0x4dc5,0x6787,0x9027,0xc193, }; #endif #if MIEEE static short A[28] = { 0xc01b,0x53d5,0xaeaa,0x4e7c, 0x4072,0x404e,0x0a98,0x409b, 0xc0c7,0x5b6b,0x5075,0x1b66, 0x4105,0x7f44,0x3452,0x1e82, 0xc144,0x031d,0x381b,0xfbed, 0x416c,0x1599,0xebd0,0x5013, 0xc193,0x9027,0x6787,0x4dc5, }; static short B[28] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xc053,0x5472,0x1254,0xe20a, 0x40a5,0x7f9e,0x0dff,0x65db, 0xc0ec,0x7695,0xf474,0x8791, 0x4128,0x28da,0x2bed,0x7a53, 0xc15a,0x38d1,0xb9e8,0xaa31, 0x4180,0xcd7a,0x2eb7,0xbabd, 0xc193,0x9027,0x6787,0x4dc5, }; #endif #endif /* 0 */ #if 0 /* 0 < x <= 8 Ei(x) - EUL - ln(x) = x A(x)/B(x) Theoretical peak relative error 2.14e-17 */ #if UNK static double A[9] = { -1.111230942210860450145E1, 3.688203982071386319616E2, -4.924786153494029574350E4, 1.050677503345557903241E6, -3.626713709916703688968E7, 4.353499908839918635414E8, -6.454613717232006895409E9, 3.408243056457762907071E10, -1.995466674647028468613E11, }; static double B[9] = { /* 1.000000000000000000000E0, */ -1.356757648138514017969E2, 8.562181317107341736606E3, -3.298257180413775117555E5, 8.543534058481435917210E6, -1.542380618535140055068E8, 1.939251779195993632028E9, -1.636096210465615015435E10, 8.396909743075306970605E10, -1.995466674647028425886E11, }; #endif #if DEC static short A[36] = { 0141061,0146004,0173357,0151553, 0042270,0064402,0147366,0126701, 0144100,0057734,0106615,0144356, 0045200,0040654,0003332,0004456, 0146412,0054440,0043130,0140263, 0047317,0113517,0033422,0065123, 0150300,0056313,0065235,0131147, 0050775,0167423,0146222,0075760, 0151471,0153642,0003442,0147667, }; static short B[36] = { /* 0040200,0000000,0000000,0000000, */ 0142007,0126376,0166077,0043600, 0043405,0144271,0125461,0014364, 0144641,0006066,0175061,0164463, 0046002,0056456,0007370,0121657, 0147023,0013706,0156647,0177115, 0047747,0026504,0103144,0054507, 0150563,0146036,0007051,0177135, 0051234,0063625,0173266,0003111, 0151471,0153642,0003442,0147666, }; #endif #if IBMPC static short A[36] = { 0xfa6d,0x9edd,0x3980,0xc026, 0xd5b8,0x59de,0x0d20,0x4077, 0xb91e,0x91b1,0x0bfb,0xc0e8, 0x4126,0x80db,0x0835,0x4130, 0x1816,0x08cb,0x4b24,0xc181, 0x4d4a,0xe6e2,0xf2e9,0x41b9, 0xb64d,0x6d53,0x0b99,0xc1f8, 0x4f7e,0x7992,0xbde2,0x421f, 0x59f7,0x40e4,0x3af4,0xc247, }; static short B[36] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xe8f0,0xdd87,0xf59f,0xc060, 0x231e,0x3566,0xb917,0x40c0, 0x3d26,0xdf46,0x2186,0xc114, 0x1476,0xc1df,0x4ba5,0x4160, 0xffca,0xdbb4,0x62f8,0xc1a2, 0x8b29,0x90cc,0xe5a8,0x41dc, 0x3fcc,0xc1c5,0x7983,0xc20e, 0xc0c9,0xbed6,0x8cf2,0x4233, 0x59f7,0x40e4,0x3af4,0xc247, }; #endif #if MIEEE static short A[36] = { 0xc026,0x3980,0x9edd,0xfa6d, 0x4077,0x0d20,0x59de,0xd5b8, 0xc0e8,0x0bfb,0x91b1,0xb91e, 0x4130,0x0835,0x80db,0x4126, 0xc181,0x4b24,0x08cb,0x1816, 0x41b9,0xf2e9,0xe6e2,0x4d4a, 0xc1f8,0x0b99,0x6d53,0xb64d, 0x421f,0xbde2,0x7992,0x4f7e, 0xc247,0x3af4,0x40e4,0x59f7, }; static short B[36] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xc060,0xf59f,0xdd87,0xe8f0, 0x40c0,0xb917,0x3566,0x231e, 0xc114,0x2186,0xdf46,0x3d26, 0x4160,0x4ba5,0xc1df,0x1476, 0xc1a2,0x62f8,0xdbb4,0xffca, 0x41dc,0xe5a8,0x90cc,0x8b29, 0xc20e,0x7983,0xc1c5,0x3fcc, 0x4233,0x8cf2,0xbed6,0xc0c9, 0xc247,0x3af4,0x40e4,0x59f7, }; #endif #endif /* 0 */ /* 8 <= x <= 20 x exp(-x) Ei(x) - 1 = 1/x R(1/x) Theoretical peak absolute error = 1.07e-17 */ #if UNK static double A2[10] = { -2.106934601691916512584E0, 1.732733869664688041885E0, -2.423619178935841904839E-1, 2.322724180937565842585E-2, 2.372880440493179832059E-4, -8.343219561192552752335E-5, 1.363408795605250394881E-5, -3.655412321999253963714E-7, 1.464941733975961318456E-8, 6.176407863710360207074E-10, }; static double B2[9] = { /* 1.000000000000000000000E0, */ -2.298062239901678075778E-1, 1.105077041474037862347E-1, -1.566542966630792353556E-2, 2.761106850817352773874E-3, -2.089148012284048449115E-4, 1.708528938807675304186E-5, -4.459311796356686423199E-7, 1.394634930353847498145E-8, 6.150865933977338354138E-10, }; #endif #if DEC static short A2[40] = { 0140406, 0154004, 0035104, 0173336, 0040335, 0145071, 0031560, 0150165, 0137570, 0026670, 0176230, 0055040, 0036676, 0043416, 0077122, 0054476, 0035170, 0150206, 0034407, 0175571, 0134656, 0174121, 0123231, 0021751, 0034144, 0136766, 0036746, 0121115, 0132704, 0037632, 0135077, 0107300, 0031573, 0126321, 0117076, 0004314, 0030451, 0143233, 0041352, 0172464, }; static short B2[36] = { /* 0040200,0000000,0000000,0000000, */ 0137553, 0051122, 0120721, 0170437, 0037342, 0050734, 0175047, 0032132, 0136600, 0052311, 0101406, 0147050, 0036064, 0171657, 0120001, 0071165, 0135133, 0010043, 0151244, 0066340, 0034217, 0051141, 0026115, 0043305, 0132757, 0064120, 0106341, 0051217, 0031557, 0114261, 0060663, 0135017, 0030451, 0011337, 0001344, 0175542, }; #endif #if IBMPC static short A2[40] = { 0x9edc, 0x8748, 0xdb00, 0xc000, 0x1a0f, 0x266e, 0xb947, 0x3ffb, 0x0b44, 0x1f93, 0x05b7, 0xbfcf, 0x4b28, 0xcfca, 0xc8e1, 0x3f97, 0xff6f, 0xc720, 0x1a10, 0x3f2f, 0x247d, 0x34d3, 0xdf0a, 0xbf15, 0xd44a, 0xc7bc, 0x97be, 0x3eec, 0xf1d8, 0x5747, 0x87f3, 0xbe98, 0xc119, 0x33c7, 0x759a, 0x3e4f, 0x5ea6, 0x685d, 0x38d3, 0x3e05, }; static short B2[36] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0x3e24, 0x543a, 0x6a4a, 0xbfcd, 0xe68b, 0x9f44, 0x4a3b, 0x3fbc, 0xd9c5, 0x3060, 0x0a99, 0xbf90, 0x2e4f, 0xf400, 0x9e75, 0x3f66, 0x8d9c, 0x7a54, 0x6204, 0xbf2b, 0xa8d9, 0x2589, 0xea4c, 0x3ef1, 0x2a52, 0x119c, 0xed0a, 0xbe9d, 0x7742, 0x2c36, 0xf316, 0x3e4d, 0x9f6c, 0xe05c, 0x225b, 0x3e05, }; #endif #if MIEEE static short A2[40] = { 0xc000, 0xdb00, 0x8748, 0x9edc, 0x3ffb, 0xb947, 0x266e, 0x1a0f, 0xbfcf, 0x05b7, 0x1f93, 0x0b44, 0x3f97, 0xc8e1, 0xcfca, 0x4b28, 0x3f2f, 0x1a10, 0xc720, 0xff6f, 0xbf15, 0xdf0a, 0x34d3, 0x247d, 0x3eec, 0x97be, 0xc7bc, 0xd44a, 0xbe98, 0x87f3, 0x5747, 0xf1d8, 0x3e4f, 0x759a, 0x33c7, 0xc119, 0x3e05, 0x38d3, 0x685d, 0x5ea6, }; static short B2[36] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xbfcd, 0x6a4a, 0x543a, 0x3e24, 0x3fbc, 0x4a3b, 0x9f44, 0xe68b, 0xbf90, 0x0a99, 0x3060, 0xd9c5, 0x3f66, 0x9e75, 0xf400, 0x2e4f, 0xbf2b, 0x6204, 0x7a54, 0x8d9c, 0x3ef1, 0xea4c, 0x2589, 0xa8d9, 0xbe9d, 0xed0a, 0x119c, 0x2a52, 0x3e4d, 0xf316, 0x2c36, 0x7742, 0x3e05, 0x225b, 0xe05c, 0x9f6c, }; #endif /* x > 20 x exp(-x) Ei(x) - 1 = 1/x A3(1/x)/B3(1/x) Theoretical absolute error = 6.15e-17 */ #if UNK static double A3[9] = { -7.657847078286127362028E-1, 6.886192415566705051750E-1, -2.132598113545206124553E-1, 3.346107552384193813594E-2, -3.076541477344756050249E-3, 1.747119316454907477380E-4, -6.103711682274170530369E-6, 1.218032765428652199087E-7, -1.086076102793290233007E-9, }; static double B3[9] = { /* 1.000000000000000000000E0, */ -1.888802868662308731041E0, 1.066691687211408896850E0, -2.751915982306380647738E-1, 3.930852688233823569726E-2, -3.414684558602365085394E-3, 1.866844370703555398195E-4, -6.345146083130515357861E-6, 1.239754287483206878024E-7, -1.086076102793126632978E-9, }; #endif #if DEC static short A3[36] = { 0140104, 0005167, 0071746, 0115510, 0040060, 0044531, 0140741, 0154556, 0137532, 0060307, 0126506, 0071123, 0037011, 0007173, 0010405, 0127224, 0136111, 0117715, 0003654, 0175577, 0035067, 0031340, 0102657, 0147714, 0133714, 0147173, 0167473, 0136640, 0032402, 0144407, 0115547, 0060114, 0130625, 0042347, 0156431, 0113425, }; static short B3[36] = { /* 0040200,0000000,0000000,0000000, */ 0140361, 0142112, 0155277, 0067714, 0040210, 0104532, 0065676, 0074326, 0137614, 0162751, 0142421, 0131033, 0037041, 0000772, 0053236, 0002632, 0136137, 0144346, 0100536, 0153136, 0035103, 0140270, 0152211, 0166215, 0133724, 0164143, 0145763, 0021153, 0032405, 0017033, 0035333, 0025736, 0130625, 0042347, 0156431, 0077134, }; #endif #if IBMPC static short A3[36] = { 0xd369, 0xee7c, 0x814e, 0xbfe8, 0x3b2e, 0x383c, 0x092b, 0x3fe6, 0xce4a, 0xf5a8, 0x4c18, 0xbfcb, 0xb5d2, 0x6220, 0x21cf, 0x3fa1, 0x9f70, 0xa0f5, 0x33f9, 0xbf69, 0xf9f9, 0x10b5, 0xe65c, 0x3f26, 0x77b4, 0x7de7, 0x99cf, 0xbed9, 0xec09, 0xf36c, 0x5920, 0x3e80, 0x32e3, 0xfba3, 0xa89c, 0xbe12, }; static short B3[36] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xedf9, 0x5b57, 0x3889, 0xbffe, 0xcf1b, 0x4d77, 0x112b, 0x3ff1, 0x3643, 0x38a2, 0x9cbd, 0xbfd1, 0xc0b3, 0x4ad3, 0x203f, 0x3fa4, 0xdacc, 0xd02b, 0xf91c, 0xbf6b, 0x3d92, 0x1a91, 0x7817, 0x3f28, 0x644d, 0x797e, 0x9d0c, 0xbeda, 0x657c, 0x675b, 0xa3c3, 0x3e80, 0x2fcb, 0xfba3, 0xa89c, 0xbe12, }; #endif #if MIEEE static short A3[36] = { 0xbfe8, 0x814e, 0xee7c, 0xd369, 0x3fe6, 0x092b, 0x383c, 0x3b2e, 0xbfcb, 0x4c18, 0xf5a8, 0xce4a, 0x3fa1, 0x21cf, 0x6220, 0xb5d2, 0xbf69, 0x33f9, 0xa0f5, 0x9f70, 0x3f26, 0xe65c, 0x10b5, 0xf9f9, 0xbed9, 0x99cf, 0x7de7, 0x77b4, 0x3e80, 0x5920, 0xf36c, 0xec09, 0xbe12, 0xa89c, 0xfba3, 0x32e3, }; static short B3[36] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xbffe, 0x3889, 0x5b57, 0xedf9, 0x3ff1, 0x112b, 0x4d77, 0xcf1b, 0xbfd1, 0x9cbd, 0x38a2, 0x3643, 0x3fa4, 0x203f, 0x4ad3, 0xc0b3, 0xbf6b, 0xf91c, 0xd02b, 0xdacc, 0x3f28, 0x7817, 0x1a91, 0x3d92, 0xbeda, 0x9d0c, 0x797e, 0x644d, 0x3e80, 0xa3c3, 0x675b, 0x657c, 0xbe12, 0xa89c, 0xfba3, 0x2fcb, }; #endif /* 16 <= x <= 32 x exp(-x) Ei(x) - 1 = 1/x A4(1/x) / B4(1/x) Theoretical absolute error = 1.22e-17 */ #if UNK static double A4[8] = { -2.458119367674020323359E-1, -1.483382253322077687183E-1, 7.248291795735551591813E-2, -1.348315687380940523823E-2, 1.342775069788636972294E-3, -7.942465637159712264564E-5, 2.644179518984235952241E-6, -4.239473659313765177195E-8, }; static double B4[8] = { /* 1.000000000000000000000E0, */ -1.044225908443871106315E-1, -2.676453128101402655055E-1, 9.695000254621984627876E-2, -1.601745692712991078208E-2, 1.496414899205908021882E-3, -8.462452563778485013756E-5, 2.728938403476726394024E-6, -4.239462431819542051337E-8, }; #endif #if DEC static short A4[32] = { 0137573, 0133037, 0152607, 0113356, 0137427, 0162771, 0145061, 0126345, 0037224, 0070754, 0110451, 0174104, 0136534, 0164165, 0072170, 0063753, 0035660, 0000016, 0002560, 0147751, 0134646, 0110311, 0123316, 0047432, 0033461, 0071250, 0101031, 0075202, 0132066, 0012601, 0077305, 0170177, }; static short B4[32] = { /* 0040200,0000000,0000000,0000000, */ 0137325, 0155602, 0162437, 0030710, 0137611, 0004316, 0071344, 0176361, 0037306, 0106671, 0011103, 0155053, 0136603, 0033412, 0132530, 0175171, 0035704, 0021532, 0015516, 0166130, 0134661, 0074162, 0036741, 0073466, 0033467, 0021316, 0003100, 0171325, 0132066, 0012541, 0162202, 0150160, }; #endif #if IBMPC static short A4[] = { 0xf2de, 0xfab0, 0x76c3, 0xbfcf, 0x359d, 0x3946, 0xfcbf, 0xbfc2, 0x3f09, 0x9225, 0x8e3d, 0x3fb2, 0x0cfd, 0xae8f, 0x9d0e, 0xbf8b, 0x19fd, 0xc0ae, 0x0001, 0x3f56, 0xc9e3, 0x34d9, 0xd219, 0xbf14, 0x2f50, 0x1043, 0x2e55, 0x3ec6, 0xbe10, 0x2fd8, 0xc2b0, 0xbe66, }; static short B4[] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xe639, 0x5ca3, 0xbb70, 0xbfba, 0x9f9e, 0xce5c, 0x2119, 0xbfd1, 0x7b45, 0x2248, 0xd1b7, 0x3fb8, 0x1f4f, 0x56ab, 0x66e1, 0xbf90, 0xdd8b, 0x4369, 0x846b, 0x3f58, 0x2ee7, 0x47bc, 0x2f0e, 0xbf16, 0x1e5b, 0xc0c8, 0xe459, 0x3ec6, 0x5a0e, 0x3c90, 0xc2ac, 0xbe66, }; #endif #if MIEEE static short A4[32] = { 0xbfcf, 0x76c3, 0xfab0, 0xf2de, 0xbfc2, 0xfcbf, 0x3946, 0x359d, 0x3fb2, 0x8e3d, 0x9225, 0x3f09, 0xbf8b, 0x9d0e, 0xae8f, 0x0cfd, 0x3f56, 0x0001, 0xc0ae, 0x19fd, 0xbf14, 0xd219, 0x34d9, 0xc9e3, 0x3ec6, 0x2e55, 0x1043, 0x2f50, 0xbe66, 0xc2b0, 0x2fd8, 0xbe10, }; static short B4[32] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xbfba, 0xbb70, 0x5ca3, 0xe639, 0xbfd1, 0x2119, 0xce5c, 0x9f9e, 0x3fb8, 0xd1b7, 0x2248, 0x7b45, 0xbf90, 0x66e1, 0x56ab, 0x1f4f, 0x3f58, 0x846b, 0x4369, 0xdd8b, 0xbf16, 0x2f0e, 0x47bc, 0x2ee7, 0x3ec6, 0xe459, 0xc0c8, 0x1e5b, 0xbe66, 0xc2ac, 0x3c90, 0x5a0e, }; #endif #if 0 /* 20 <= x <= 40 x exp(-x) Ei(x) - 1 = 1/x A4(1/x) / B4(1/x) Theoretical absolute error = 1.78e-17 */ #if UNK static double A4[8] = { 2.067245813525780707978E-1, -5.153749551345223645670E-1, 1.928289589546695033096E-1, -3.124468842857260044075E-2, 2.740283734277352539912E-3, -1.377775664366875175601E-4, 3.803788980664744242323E-6, -4.611038277393688031154E-8, }; static double B4[8] = { /* 1.000000000000000000000E0, */ -8.544436025219516861531E-1, 2.507436807692907385181E-1, -3.647688090228423114064E-2, 3.008576950332041388892E-3, -1.452926405348421286334E-4, 3.896007735260115431965E-6, -4.611037642697098234083E-8, }; #endif #if DEC static short A4[32] = { 0037523,0127633,0150301,0022031, 0140003,0167634,0170572,0170420, 0037505,0072364,0060672,0063220, 0136777,0172334,0057456,0102640, 0036063,0113125,0002476,0047251, 0135020,0074142,0042600,0043630, 0033577,0042230,0155372,0136105, 0132106,0005346,0165333,0114541, }; static short B4[28] = { /* 0040200,0000000,0000000,0000000, */ 0140132,0136320,0160433,0131535, 0037600,0060571,0144452,0060214, 0137025,0064310,0024220,0176472, 0036105,0025613,0115762,0166605, 0135030,0054662,0035454,0061763, 0033602,0135163,0116430,0000066, 0132106,0005345,0020602,0137133, }; #endif #if IBMPC static short A4[32] = { 0x2483,0x7a18,0x75f3,0x3fca, 0x5e22,0x9e2f,0x7df3,0xbfe0, 0x4cd2,0x8c37,0xae9e,0x3fc8, 0xd0b4,0x8be5,0xfe9b,0xbf9f, 0xc9d5,0xa0a7,0x72ca,0x3f66, 0x08f3,0x48b0,0x0f0c,0xbf22, 0x5789,0x1b5f,0xe893,0x3ecf, 0x732c,0xdd5b,0xc15c,0xbe68, }; static short B4[28] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0x766c,0x1c23,0x579a,0xbfeb, 0x4c11,0x3925,0x0c2f,0x3fd0, 0x1fa7,0x0512,0xad19,0xbfa2, 0x5db1,0x737e,0xa571,0x3f68, 0x8c7e,0x4765,0x0b36,0xbf23, 0x0007,0x73a3,0x574e,0x3ed0, 0x57cb,0xa430,0xc15c,0xbe68, }; #endif #if MIEEE static short A4[32] = { 0x3fca,0x75f3,0x7a18,0x2483, 0xbfe0,0x7df3,0x9e2f,0x5e22, 0x3fc8,0xae9e,0x8c37,0x4cd2, 0xbf9f,0xfe9b,0x8be5,0xd0b4, 0x3f66,0x72ca,0xa0a7,0xc9d5, 0xbf22,0x0f0c,0x48b0,0x08f3, 0x3ecf,0xe893,0x1b5f,0x5789, 0xbe68,0xc15c,0xdd5b,0x732c, }; static short B4[28] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xbfeb,0x579a,0x1c23,0x766c, 0x3fd0,0x0c2f,0x3925,0x4c11, 0xbfa2,0xad19,0x0512,0x1fa7, 0x3f68,0xa571,0x737e,0x5db1, 0xbf23,0x0b36,0x4765,0x8c7e, 0x3ed0,0x574e,0x73a3,0x0007, 0xbe68,0xc15c,0xa430,0x57cb, }; #endif #endif /* 0 */ /* 4 <= x <= 8 x exp(-x) Ei(x) - 1 = 1/x A5(1/x) / B5(1/x) Theoretical absolute error = 2.20e-17 */ #if UNK static double A5[8] = { -1.373215375871208729803E0, -7.084559133740838761406E-1, 1.580806855547941010501E0, -2.601500427425622944234E-1, 2.994674694113713763365E-2, -1.038086040188744005513E-3, 4.371064420753005429514E-5, 2.141783679522602903795E-6, }; static double B5[8] = { /* 1.000000000000000000000E0, */ 8.585231423622028380768E-1, 4.483285822873995129957E-1, 7.687932158124475434091E-2, 2.449868241021887685904E-2, 8.832165941927796567926E-4, 4.590952299511353531215E-4, -4.729848351866523044863E-6, 2.665195537390710170105E-6, }; #endif #if DEC static short A5[32] = { 0140257, 0142605, 0076335, 0113632, 0140065, 0056535, 0161231, 0074311, 0040312, 0053741, 0004357, 0076405, 0137605, 0031142, 0165503, 0136705, 0036765, 0051341, 0053573, 0007602, 0135610, 0010143, 0027643, 0110522, 0034467, 0052762, 0062024, 0120161, 0033417, 0135620, 0036500, 0062647, }; static short B[32] = { /* 0040200,0000000,0000000,0000000, */ 0040133, 0144054, 0031516, 0004100, 0037745, 0105522, 0166622, 0123146, 0037235, 0071347, 0157560, 0157464, 0036710, 0130565, 0173747, 0041670, 0035547, 0103651, 0106243, 0101240, 0035360, 0131267, 0176263, 0140257, 0133636, 0132426, 0102537, 0102531, 0033462, 0155665, 0167503, 0176350, }; #endif #if IBMPC static short A5[32] = { 0xb2f3, 0xaf9b, 0xf8b0, 0xbff5, 0x2f19, 0xbc53, 0xabab, 0xbfe6, 0xefa1, 0x211d, 0x4afc, 0x3ff9, 0x77b9, 0x5d68, 0xa64c, 0xbfd0, 0x61f0, 0x2aef, 0xaa5c, 0x3f9e, 0x722a, 0x65f4, 0x020c, 0xbf51, 0x940e, 0x4c82, 0xeabe, 0x3f06, 0x0cb5, 0x07a8, 0xf772, 0x3ec1, }; static short B5[32] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xc108, 0x8669, 0x7905, 0x3feb, 0x54cd, 0x5db2, 0xb16a, 0x3fdc, 0x1be7, 0xfbee, 0xae5c, 0x3fb3, 0xe877, 0xbefc, 0x162e, 0x3f99, 0x7054, 0x3194, 0xf0f5, 0x3f4c, 0x7816, 0xff96, 0x1656, 0x3f3e, 0xf0ab, 0xd0ab, 0xd6a2, 0xbed3, 0x7f9d, 0xbde8, 0x5b76, 0x3ec6, }; #endif #if MIEEE static short A5[32] = { 0xbff5, 0xf8b0, 0xaf9b, 0xb2f3, 0xbfe6, 0xabab, 0xbc53, 0x2f19, 0x3ff9, 0x4afc, 0x211d, 0xefa1, 0xbfd0, 0xa64c, 0x5d68, 0x77b9, 0x3f9e, 0xaa5c, 0x2aef, 0x61f0, 0xbf51, 0x020c, 0x65f4, 0x722a, 0x3f06, 0xeabe, 0x4c82, 0x940e, 0x3ec1, 0xf772, 0x07a8, 0x0cb5, }; static short B5[32] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0x3feb, 0x7905, 0x8669, 0xc108, 0x3fdc, 0xb16a, 0x5db2, 0x54cd, 0x3fb3, 0xae5c, 0xfbee, 0x1be7, 0x3f99, 0x162e, 0xbefc, 0xe877, 0x3f4c, 0xf0f5, 0x3194, 0x7054, 0x3f3e, 0x1656, 0xff96, 0x7816, 0xbed3, 0xd6a2, 0xd0ab, 0xf0ab, 0x3ec6, 0x5b76, 0xbde8, 0x7f9d, }; #endif /* 2 <= x <= 4 x exp(-x) Ei(x) - 1 = 1/x A6(1/x) / B6(1/x) Theoretical absolute error = 4.89e-17 */ #if UNK static double A6[8] = { 1.981808503259689673238E-2, -1.271645625984917501326E0, -2.088160335681228318920E0, 2.755544509187936721172E0, -4.409507048701600257171E-1, 4.665623805935891391017E-2, -1.545042679673485262580E-3, 7.059980605299617478514E-5, }; static double B6[7] = { /* 1.000000000000000000000E0, */ 1.476498670914921440652E0, 5.629177174822436244827E-1, 1.699017897879307263248E-1, 2.291647179034212017463E-2, 4.450150439728752875043E-3, 1.727439612206521482874E-4, 3.953167195549672482304E-5, }; #endif #if DEC static short A6[32] = { 0036642, 0054611, 0061263, 0000140, 0140242, 0142510, 0125732, 0072035, 0140405, 0122153, 0037643, 0104527, 0040460, 0055327, 0055550, 0116240, 0137741, 0142112, 0070441, 0103510, 0037077, 0015234, 0104750, 0146765, 0135712, 0101407, 0107554, 0020253, 0034624, 0007373, 0072621, 0063735, }; static short B6[28] = { /* 0040200,0000000,0000000,0000000, */ 0040274, 0176750, 0110025, 0061006, 0040020, 0015540, 0021354, 0155050, 0037455, 0175274, 0015257, 0021112, 0036673, 0135523, 0016042, 0117203, 0036221, 0151221, 0046352, 0144174, 0035065, 0021232, 0117727, 0152432, 0034445, 0147317, 0037300, 0067123, }; #endif #if IBMPC static short A6[32] = { 0x600c, 0x2c56, 0x4b31, 0x3f94, 0x4e84, 0x157b, 0x58a9, 0xbff4, 0x712b, 0x67f4, 0xb48d, 0xc000, 0x1394, 0xeb6d, 0x0b5a, 0x4006, 0x30e9, 0x4e24, 0x3889, 0xbfdc, 0x19bf, 0x913d, 0xe353, 0x3fa7, 0x8415, 0xf1ed, 0x5060, 0xbf59, 0x2cfc, 0x6eb2, 0x81df, 0x3f12, }; static short B6[28] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xac41, 0x1202, 0x9fbd, 0x3ff7, 0x9b45, 0x045d, 0x036c, 0x3fe2, 0xe449, 0x8355, 0xbf57, 0x3fc5, 0x53d0, 0x6384, 0x776a, 0x3f97, 0x590f, 0x299d, 0x3a52, 0x3f72, 0xfaa3, 0x53fa, 0xa453, 0x3f26, 0x0dca, 0xe7d8, 0xb9d9, 0x3f04, }; #endif #if MIEEE static short A6[32] = { 0x3f94, 0x4b31, 0x2c56, 0x600c, 0xbff4, 0x58a9, 0x157b, 0x4e84, 0xc000, 0xb48d, 0x67f4, 0x712b, 0x4006, 0x0b5a, 0xeb6d, 0x1394, 0xbfdc, 0x3889, 0x4e24, 0x30e9, 0x3fa7, 0xe353, 0x913d, 0x19bf, 0xbf59, 0x5060, 0xf1ed, 0x8415, 0x3f12, 0x81df, 0x6eb2, 0x2cfc, }; static short B6[28] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0x3ff7, 0x9fbd, 0x1202, 0xac41, 0x3fe2, 0x036c, 0x045d, 0x9b45, 0x3fc5, 0xbf57, 0x8355, 0xe449, 0x3f97, 0x776a, 0x6384, 0x53d0, 0x3f72, 0x3a52, 0x299d, 0x590f, 0x3f26, 0xa453, 0x53fa, 0xfaa3, 0x3f04, 0xb9d9, 0xe7d8, 0x0dca, }; #endif /* 32 <= x <= 64 x exp(-x) Ei(x) - 1 = 1/x A7(1/x) / B7(1/x) Theoretical absolute error = 7.71e-18 */ #if UNK static double A7[6] = { 1.212561118105456670844E-1, -5.823133179043894485122E-1, 2.348887314557016779211E-1, -3.040034318113248237280E-2, 1.510082146865190661777E-3, -2.523137095499571377122E-5, }; static double B7[5] = { /* 1.000000000000000000000E0, */ -1.002252150365854016662E0, 2.928709694872224144953E-1, -3.337004338674007801307E-2, 1.560544881127388842819E-3, -2.523137093603234562648E-5, }; #endif #if DEC static short A7[24] = { 0037370, 0052437, 0152524, 0150125, 0140025, 0011174, 0050154, 0131330, 0037560, 0103253, 0167464, 0062245, 0136771, 0005043, 0174001, 0023345, 0035705, 0166762, 0157300, 0016451, 0134323, 0123764, 0157767, 0134477, }; static short B7[20] = { /* 0040200,0000000,0000000,0000000, */ 0140200, 0044714, 0064025, 0060324, 0037625, 0171457, 0003712, 0073131, 0137010, 0127406, 0150061, 0141746, 0035714, 0105462, 0072356, 0103712, 0134323, 0123764, 0156514, 0077414, }; #endif #if IBMPC static short A7[24] = { 0x9a0b, 0xfaaa, 0x0aa3, 0x3fbf, 0x965b, 0x8a0d, 0xa24f, 0xbfe2, 0x8c95, 0x7de6, 0x10d5, 0x3fce, 0x24dd, 0x7f00, 0x2144, 0xbf9f, 0x03a5, 0x5bd8, 0xbdbe, 0x3f58, 0xf728, 0x9bfe, 0x74fe, 0xbefa, }; static short B7[20] = { /* 0x0000,0x0000,0x0000,0x3ff0, */ 0xac1a, 0x8d02, 0x0939, 0xbff0, 0x4ecb, 0xe0f9, 0xbe65, 0x3fd2, 0x387d, 0xda06, 0x15e0, 0xbfa1, 0xd0f9, 0x4e9d, 0x9166, 0x3f59, 0x8fe2, 0x9ba9, 0x74fe, 0xbefa, }; #endif #if MIEEE static short A7[24] = { 0x3fbf, 0x0aa3, 0xfaaa, 0x9a0b, 0xbfe2, 0xa24f, 0x8a0d, 0x965b, 0x3fce, 0x10d5, 0x7de6, 0x8c95, 0xbf9f, 0x2144, 0x7f00, 0x24dd, 0x3f58, 0xbdbe, 0x5bd8, 0x03a5, 0xbefa, 0x74fe, 0x9bfe, 0xf728, }; static short B7[20] = { /* 0x3ff0,0x0000,0x0000,0x0000, */ 0xbff0, 0x0939, 0x8d02, 0xac1a, 0x3fd2, 0xbe65, 0xe0f9, 0x4ecb, 0xbfa1, 0x15e0, 0xda06, 0x387d, 0x3f59, 0x9166, 0x4e9d, 0xd0f9, 0xbefa, 0x74fe, 0x9ba9, 0x8fe2, }; #endif double ei(x) double x; { double f, w; if (x <= 0.0) { mtherr("ei", DOMAIN); return 0.0; } else if (x < 2.0) { /* Power series. inf n - x Ei(x) = EUL + ln x + > ---- - n n! n=1 */ f = polevl(x, A, 5) / p1evl(x, B, 6); /* f = polevl(x,A,6) / p1evl(x,B,7); */ /* f = polevl(x,A,8) / p1evl(x,B,9); */ return (EUL + log(x) + x * f); } else if (x < 4.0) { /* Asymptotic expansion. 1 2 6 x exp(-x) Ei(x) = 1 + --- + --- + ---- + ... x 2 3 x x */ w = 1.0 / x; f = polevl(w, A6, 7) / p1evl(w, B6, 7); return (exp(x) * w * (1.0 + w * f)); } else if (x < 8.0) { w = 1.0 / x; f = polevl(w, A5, 7) / p1evl(w, B5, 8); return (exp(x) * w * (1.0 + w * f)); } else if (x < 16.0) { w = 1.0 / x; f = polevl(w, A2, 9) / p1evl(w, B2, 9); return (exp(x) * w * (1.0 + w * f)); } else if (x < 32.0) { w = 1.0 / x; f = polevl(w, A4, 7) / p1evl(w, B4, 8); return (exp(x) * w * (1.0 + w * f)); } else if (x < 64.0) { w = 1.0 / x; f = polevl(w, A7, 5) / p1evl(w, B7, 5); return (exp(x) * w * (1.0 + w * f)); } else { w = 1.0 / x; f = polevl(w, A3, 8) / p1evl(w, B3, 9); return (exp(x) * w * (1.0 + w * f)); } }