j1.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. /* j1.c
  2. *
  3. * Bessel function of order one
  4. *
  5. *
  6. *
  7. * SYNOPSIS:
  8. *
  9. * double x, y, j1();
  10. *
  11. * y = j1( x );
  12. *
  13. *
  14. *
  15. * DESCRIPTION:
  16. *
  17. * Returns Bessel function of order one of the argument.
  18. *
  19. * The domain is divided into the intervals [0, 8] and
  20. * (8, infinity). In the first interval a 24 term Chebyshev
  21. * expansion is used. In the second, the asymptotic
  22. * trigonometric representation is employed using two
  23. * rational functions of degree 5/5.
  24. *
  25. *
  26. *
  27. * ACCURACY:
  28. *
  29. * Absolute error:
  30. * arithmetic domain # trials peak rms
  31. * DEC 0, 30 10000 4.0e-17 1.1e-17
  32. * IEEE 0, 30 30000 2.6e-16 1.1e-16
  33. *
  34. *
  35. */
  36. /* y1.c
  37. *
  38. * Bessel function of second kind of order one
  39. *
  40. *
  41. *
  42. * SYNOPSIS:
  43. *
  44. * double x, y, y1();
  45. *
  46. * y = y1( x );
  47. *
  48. *
  49. *
  50. * DESCRIPTION:
  51. *
  52. * Returns Bessel function of the second kind of order one
  53. * of the argument.
  54. *
  55. * The domain is divided into the intervals [0, 8] and
  56. * (8, infinity). In the first interval a 25 term Chebyshev
  57. * expansion is used, and a call to j1() is required.
  58. * In the second, the asymptotic trigonometric representation
  59. * is employed using two rational functions of degree 5/5.
  60. *
  61. *
  62. *
  63. * ACCURACY:
  64. *
  65. * Absolute error:
  66. * arithmetic domain # trials peak rms
  67. * DEC 0, 30 10000 8.6e-17 1.3e-17
  68. * IEEE 0, 30 30000 1.0e-15 1.3e-16
  69. *
  70. * (error criterion relative when |y1| > 1).
  71. *
  72. */
  73. /*
  74. Cephes Math Library Release 2.8: June, 2000
  75. Copyright 1984, 1987, 1989, 2000 by Stephen L. Moshier
  76. */
  77. /*
  78. #define PIO4 .78539816339744830962
  79. #define THPIO4 2.35619449019234492885
  80. #define SQ2OPI .79788456080286535588
  81. */
  82. #include "mconf.h"
  83. #ifdef UNK
  84. static double RP[4] = {
  85. -8.99971225705559398224E8,
  86. 4.52228297998194034323E11,
  87. -7.27494245221818276015E13,
  88. 3.68295732863852883286E15,
  89. };
  90. static double RQ[8] = {
  91. /* 1.00000000000000000000E0,*/
  92. 6.20836478118054335476E2, 2.56987256757748830383E5,
  93. 8.35146791431949253037E7, 2.21511595479792499675E10,
  94. 4.74914122079991414898E12, 7.84369607876235854894E14,
  95. 8.95222336184627338078E16, 5.32278620332680085395E18,
  96. };
  97. #endif
  98. #ifdef DEC
  99. static unsigned short RP[16] = {
  100. 0147526, 0110742, 0063322, 0077052, 0051722, 0112720, 0065034, 0061530,
  101. 0153604, 0052227, 0033147, 0105650, 0055121, 0055025, 0032276, 0022015,
  102. };
  103. static unsigned short RQ[32] = {
  104. /*0040200,0000000,0000000,0000000,*/
  105. 0042433, 0032610, 0155604, 0033473, 0044572, 0173320, 0067270, 0006616,
  106. 0046637, 0045246, 0162225, 0006606, 0050645, 0004773, 0157577, 0053004,
  107. 0052612, 0033734, 0001667, 0176501, 0054462, 0054121, 0173147, 0121367,
  108. 0056237, 0002777, 0121451, 0176007, 0057623, 0136253, 0131601, 0044710,
  109. };
  110. #endif
  111. #ifdef IBMPC
  112. static unsigned short RP[16] = {
  113. 0x4fc5, 0x4cda, 0xd23c, 0xc1ca, 0x8c6b, 0x0d43, 0x52ba, 0x425a,
  114. 0xf175, 0xe6cc, 0x8a92, 0xc2d0, 0xc482, 0xa697, 0x2b42, 0x432a,
  115. };
  116. static unsigned short RQ[32] = {
  117. /*0x0000,0x0000,0x0000,0x3ff0,*/
  118. 0x86e7, 0x1b70, 0x66b1, 0x4083, 0x01b2, 0x0dd7, 0x5eda, 0x410f,
  119. 0xa1b1, 0xdc92, 0xe954, 0x4193, 0xeac1, 0x7bef, 0xa13f, 0x4214,
  120. 0xffa8, 0x8076, 0x46fb, 0x4291, 0xf45f, 0x3ecc, 0x4b0a, 0x4306,
  121. 0x3f81, 0xf465, 0xe0bf, 0x4373, 0x2939, 0x7670, 0x7795, 0x43d2,
  122. };
  123. #endif
  124. #ifdef MIEEE
  125. static unsigned short RP[16] = {
  126. 0xc1ca, 0xd23c, 0x4cda, 0x4fc5, 0x425a, 0x52ba, 0x0d43, 0x8c6b,
  127. 0xc2d0, 0x8a92, 0xe6cc, 0xf175, 0x432a, 0x2b42, 0xa697, 0xc482,
  128. };
  129. static unsigned short RQ[32] = {
  130. /*0x3ff0,0x0000,0x0000,0x0000,*/
  131. 0x4083, 0x66b1, 0x1b70, 0x86e7, 0x410f, 0x5eda, 0x0dd7, 0x01b2,
  132. 0x4193, 0xe954, 0xdc92, 0xa1b1, 0x4214, 0xa13f, 0x7bef, 0xeac1,
  133. 0x4291, 0x46fb, 0x8076, 0xffa8, 0x4306, 0x4b0a, 0x3ecc, 0xf45f,
  134. 0x4373, 0xe0bf, 0xf465, 0x3f81, 0x43d2, 0x7795, 0x7670, 0x2939,
  135. };
  136. #endif
  137. #ifdef UNK
  138. static double PP[7] = {
  139. 7.62125616208173112003E-4, 7.31397056940917570436E-2,
  140. 1.12719608129684925192E0, 5.11207951146807644818E0,
  141. 8.42404590141772420927E0, 5.21451598682361504063E0,
  142. 1.00000000000000000254E0,
  143. };
  144. static double PQ[7] = {
  145. 5.71323128072548699714E-4, 6.88455908754495404082E-2,
  146. 1.10514232634061696926E0, 5.07386386128601488557E0,
  147. 8.39985554327604159757E0, 5.20982848682361821619E0,
  148. 9.99999999999999997461E-1,
  149. };
  150. #endif
  151. #ifdef DEC
  152. static unsigned short PP[28] = {
  153. 0035507, 0144542, 0061543, 0024326, 0037225, 0145105, 0017766,
  154. 0022661, 0040220, 0043766, 0010254, 0133255, 0040643, 0113047,
  155. 0142611, 0151521, 0041006, 0144344, 0055351, 0074261, 0040646,
  156. 0156520, 0120574, 0006416, 0040200, 0000000, 0000000, 0000000,
  157. };
  158. static unsigned short PQ[28] = {
  159. 0035425, 0142330, 0115041, 0165514, 0037214, 0177352, 0145105,
  160. 0052026, 0040215, 0072515, 0141207, 0073255, 0040642, 0056427,
  161. 0137222, 0106405, 0041006, 0062716, 0166427, 0165450, 0040646,
  162. 0133352, 0035425, 0123304, 0040200, 0000000, 0000000, 0000000,
  163. };
  164. #endif
  165. #ifdef IBMPC
  166. static unsigned short PP[28] = {
  167. 0x651b, 0x4c6c, 0xf92c, 0x3f48, 0xc4b6, 0xa3fe, 0xb948,
  168. 0x3fb2, 0x96d6, 0xc215, 0x08fe, 0x3ff2, 0x3a6a, 0xf8b1,
  169. 0x72c4, 0x4014, 0x2f16, 0x8b5d, 0xd91c, 0x4020, 0x81a2,
  170. 0x142f, 0xdbaa, 0x4014, 0x0000, 0x0000, 0x0000, 0x3ff0,
  171. };
  172. static unsigned short PQ[28] = {
  173. 0x3d69, 0x1344, 0xb89b, 0x3f42, 0xaa83, 0x5948, 0x9fdd,
  174. 0x3fb1, 0xeed6, 0xb850, 0xaea9, 0x3ff1, 0x51a1, 0xf7d2,
  175. 0x4ba2, 0x4014, 0xfd65, 0xdda2, 0xccb9, 0x4020, 0xb4d9,
  176. 0x4762, 0xd6dd, 0x4014, 0x0000, 0x0000, 0x0000, 0x3ff0,
  177. };
  178. #endif
  179. #ifdef MIEEE
  180. static unsigned short PP[28] = {
  181. 0x3f48, 0xf92c, 0x4c6c, 0x651b, 0x3fb2, 0xb948, 0xa3fe,
  182. 0xc4b6, 0x3ff2, 0x08fe, 0xc215, 0x96d6, 0x4014, 0x72c4,
  183. 0xf8b1, 0x3a6a, 0x4020, 0xd91c, 0x8b5d, 0x2f16, 0x4014,
  184. 0xdbaa, 0x142f, 0x81a2, 0x3ff0, 0x0000, 0x0000, 0x0000,
  185. };
  186. static unsigned short PQ[28] = {
  187. 0x3f42, 0xb89b, 0x1344, 0x3d69, 0x3fb1, 0x9fdd, 0x5948,
  188. 0xaa83, 0x3ff1, 0xaea9, 0xb850, 0xeed6, 0x4014, 0x4ba2,
  189. 0xf7d2, 0x51a1, 0x4020, 0xccb9, 0xdda2, 0xfd65, 0x4014,
  190. 0xd6dd, 0x4762, 0xb4d9, 0x3ff0, 0x0000, 0x0000, 0x0000,
  191. };
  192. #endif
  193. #ifdef UNK
  194. static double QP[8] = {
  195. 5.10862594750176621635E-2, 4.98213872951233449420E0,
  196. 7.58238284132545283818E1, 3.66779609360150777800E2,
  197. 7.10856304998926107277E2, 5.97489612400613639965E2,
  198. 2.11688757100572135698E2, 2.52070205858023719784E1,
  199. };
  200. static double QQ[7] = {
  201. /* 1.00000000000000000000E0,*/
  202. 7.42373277035675149943E1, 1.05644886038262816351E3,
  203. 4.98641058337653607651E3, 9.56231892404756170795E3,
  204. 7.99704160447350683650E3, 2.82619278517639096600E3,
  205. 3.36093607810698293419E2,
  206. };
  207. #endif
  208. #ifdef DEC
  209. static unsigned short QP[32] = {
  210. 0037121, 0037723, 0055605, 0151004, 0040637, 0066656, 0031554, 0077264,
  211. 0041627, 0122714, 0153170, 0161466, 0042267, 0061712, 0036520, 0140145,
  212. 0042461, 0133315, 0131573, 0071176, 0042425, 0057525, 0147500, 0013201,
  213. 0042123, 0130122, 0061245, 0154131, 0041311, 0123772, 0064254, 0172650,
  214. };
  215. static unsigned short QQ[28] = {
  216. /*0040200,0000000,0000000,0000000,*/
  217. 0041624, 0074603, 0002112, 0101670, 0042604, 0007135, 0010162,
  218. 0175565, 0043233, 0151510, 0157757, 0172010, 0043425, 0064506,
  219. 0112006, 0104276, 0043371, 0164125, 0032271, 0164242, 0043060,
  220. 0121425, 0122750, 0136013, 0042250, 0005773, 0053472, 0146267,
  221. };
  222. #endif
  223. #ifdef IBMPC
  224. static unsigned short QP[32] = {
  225. 0xba40, 0x6b70, 0x27fa, 0x3faa, 0x8fd6, 0xc66d, 0xedb5, 0x4013,
  226. 0x1c67, 0x9acf, 0xf4b9, 0x4052, 0x180d, 0x47aa, 0xec79, 0x4076,
  227. 0x6e50, 0xb66f, 0x36d9, 0x4086, 0x02d0, 0xb9e8, 0xabea, 0x4082,
  228. 0xbb0b, 0x4c54, 0x760a, 0x406a, 0x9eb5, 0x4d15, 0x34ff, 0x4039,
  229. };
  230. static unsigned short QQ[28] = {
  231. /*0x0000,0x0000,0x0000,0x3ff0,*/
  232. 0x5077, 0x6089, 0x8f30, 0x4052, 0x5f6f, 0xa20e, 0x81cb,
  233. 0x4090, 0xfe81, 0x1bfd, 0x7a69, 0x40b3, 0xd118, 0xd280,
  234. 0xad28, 0x40c2, 0x3d14, 0xa697, 0x3d0a, 0x40bf, 0x1781,
  235. 0xb4bd, 0x1462, 0x40a6, 0x5997, 0x6ae7, 0x017f, 0x4075,
  236. };
  237. #endif
  238. #ifdef MIEEE
  239. static unsigned short QP[32] = {
  240. 0x3faa, 0x27fa, 0x6b70, 0xba40, 0x4013, 0xedb5, 0xc66d, 0x8fd6,
  241. 0x4052, 0xf4b9, 0x9acf, 0x1c67, 0x4076, 0xec79, 0x47aa, 0x180d,
  242. 0x4086, 0x36d9, 0xb66f, 0x6e50, 0x4082, 0xabea, 0xb9e8, 0x02d0,
  243. 0x406a, 0x760a, 0x4c54, 0xbb0b, 0x4039, 0x34ff, 0x4d15, 0x9eb5,
  244. };
  245. static unsigned short QQ[28] = {
  246. /*0x3ff0,0x0000,0x0000,0x0000,*/
  247. 0x4052, 0x8f30, 0x6089, 0x5077, 0x4090, 0x81cb, 0xa20e,
  248. 0x5f6f, 0x40b3, 0x7a69, 0x1bfd, 0xfe81, 0x40c2, 0xad28,
  249. 0xd280, 0xd118, 0x40bf, 0x3d0a, 0xa697, 0x3d14, 0x40a6,
  250. 0x1462, 0xb4bd, 0x1781, 0x4075, 0x017f, 0x6ae7, 0x5997,
  251. };
  252. #endif
  253. #ifdef UNK
  254. static double YP[6] = {
  255. 1.26320474790178026440E9, -6.47355876379160291031E11,
  256. 1.14509511541823727583E14, -8.12770255501325109621E15,
  257. 2.02439475713594898196E17, -7.78877196265950026825E17,
  258. };
  259. static double YQ[8] = {
  260. /* 1.00000000000000000000E0,*/
  261. 5.94301592346128195359E2, 2.35564092943068577943E5,
  262. 7.34811944459721705660E7, 1.87601316108706159478E10,
  263. 3.88231277496238566008E12, 6.20557727146953693363E14,
  264. 6.87141087355300489866E16, 3.97270608116560655612E18,
  265. };
  266. #endif
  267. #ifdef DEC
  268. static unsigned short YP[24] = {
  269. 0047626, 0112763, 0013715, 0133045, 0152026, 0134552, 0142033, 0024411,
  270. 0053720, 0045245, 0102210, 0077565, 0155347, 0000321, 0136415, 0102031,
  271. 0056463, 0146550, 0055633, 0032605, 0157054, 0171012, 0167361, 0054265,
  272. };
  273. static unsigned short YQ[32] = {
  274. /*0040200,0000000,0000000,0000000,*/
  275. 0042424, 0111515, 0044773, 0153014, 0044546, 0005405, 0171307, 0075774,
  276. 0046614, 0023575, 0047105, 0063556, 0050613, 0143034, 0101533, 0156026,
  277. 0052541, 0175367, 0166514, 0114257, 0054415, 0014466, 0134350, 0171154,
  278. 0056164, 0017436, 0025075, 0022101, 0057534, 0103614, 0103663, 0121772,
  279. };
  280. #endif
  281. #ifdef IBMPC
  282. static unsigned short YP[24] = {
  283. 0xb6c5, 0x62f9, 0xd2be, 0x41d2, 0x6521, 0x5883, 0xd72d, 0xc262,
  284. 0x0fef, 0xb091, 0x0954, 0x42da, 0xb083, 0x37a1, 0xe01a, 0xc33c,
  285. 0x66b1, 0x0b73, 0x79ad, 0x4386, 0x2b17, 0x5dde, 0x9e41, 0xc3a5,
  286. };
  287. static unsigned short YQ[32] = {
  288. /*0x0000,0x0000,0x0000,0x3ff0,*/
  289. 0x7ac2, 0xa93f, 0x9269, 0x4082, 0xef7f, 0xbe58, 0xc160, 0x410c,
  290. 0xacee, 0xa9c8, 0x84ef, 0x4191, 0x7b83, 0x906b, 0x78c3, 0x4211,
  291. 0x9316, 0xfda9, 0x3f5e, 0x428c, 0x1e4e, 0xd71d, 0xa326, 0x4301,
  292. 0xa488, 0xc547, 0x83e3, 0x436e, 0x747f, 0x90f6, 0x90f1, 0x43cb,
  293. };
  294. #endif
  295. #ifdef MIEEE
  296. static unsigned short YP[24] = {
  297. 0x41d2, 0xd2be, 0x62f9, 0xb6c5, 0xc262, 0xd72d, 0x5883, 0x6521,
  298. 0x42da, 0x0954, 0xb091, 0x0fef, 0xc33c, 0xe01a, 0x37a1, 0xb083,
  299. 0x4386, 0x79ad, 0x0b73, 0x66b1, 0xc3a5, 0x9e41, 0x5dde, 0x2b17,
  300. };
  301. static unsigned short YQ[32] = {
  302. /*0x3ff0,0x0000,0x0000,0x0000,*/
  303. 0x4082, 0x9269, 0xa93f, 0x7ac2, 0x410c, 0xc160, 0xbe58, 0xef7f,
  304. 0x4191, 0x84ef, 0xa9c8, 0xacee, 0x4211, 0x78c3, 0x906b, 0x7b83,
  305. 0x428c, 0x3f5e, 0xfda9, 0x9316, 0x4301, 0xa326, 0xd71d, 0x1e4e,
  306. 0x436e, 0x83e3, 0xc547, 0xa488, 0x43cb, 0x90f1, 0x90f6, 0x747f,
  307. };
  308. #endif
  309. #ifdef UNK
  310. static double Z1 = 1.46819706421238932572E1;
  311. static double Z2 = 4.92184563216946036703E1;
  312. #endif
  313. #ifdef DEC
  314. static unsigned short DZ1[] = {0041152, 0164532, 0006114, 0010540};
  315. static unsigned short DZ2[] = {0041504, 0157663, 0001625, 0020621};
  316. #define Z1 (*(double *)DZ1)
  317. #define Z2 (*(double *)DZ2)
  318. #endif
  319. #ifdef IBMPC
  320. static unsigned short DZ1[] = {0x822c, 0x4189, 0x5d2b, 0x402d};
  321. static unsigned short DZ2[] = {0xa432, 0x6072, 0x9bf6, 0x4048};
  322. #define Z1 (*(double *)DZ1)
  323. #define Z2 (*(double *)DZ2)
  324. #endif
  325. #ifdef MIEEE
  326. static unsigned short DZ1[] = {0x402d, 0x5d2b, 0x4189, 0x822c};
  327. static unsigned short DZ2[] = {0x4048, 0x9bf6, 0x6072, 0xa432};
  328. #define Z1 (*(double *)DZ1)
  329. #define Z2 (*(double *)DZ2)
  330. #endif
  331. #ifdef ANSIPROT
  332. extern double polevl(double, void *, int);
  333. extern double p1evl(double, void *, int);
  334. extern double log(double);
  335. extern double sin(double);
  336. extern double cos(double);
  337. extern double sqrt(double);
  338. double j1(double);
  339. #else
  340. double polevl(), p1evl(), log(), sin(), cos(), sqrt();
  341. double j1();
  342. #endif
  343. extern double TWOOPI, THPIO4, SQ2OPI;
  344. double j1(x) double x;
  345. {
  346. double w, z, p, q, xn;
  347. w = x;
  348. if (x < 0)
  349. w = -x;
  350. if (w <= 5.0) {
  351. z = x * x;
  352. w = polevl(z, RP, 3) / p1evl(z, RQ, 8);
  353. w = w * x * (z - Z1) * (z - Z2);
  354. return (w);
  355. }
  356. w = 5.0 / x;
  357. z = w * w;
  358. p = polevl(z, PP, 6) / polevl(z, PQ, 6);
  359. q = polevl(z, QP, 7) / p1evl(z, QQ, 7);
  360. xn = x - THPIO4;
  361. p = p * cos(xn) - w * q * sin(xn);
  362. return (p * SQ2OPI / sqrt(x));
  363. }
  364. extern double MAXNUM;
  365. double y1(x) double x;
  366. {
  367. double w, z, p, q, xn;
  368. if (x <= 5.0) {
  369. if (x <= 0.0) {
  370. mtherr("y1", DOMAIN);
  371. return (-MAXNUM);
  372. }
  373. z = x * x;
  374. w = x * (polevl(z, YP, 5) / p1evl(z, YQ, 8));
  375. w += TWOOPI * (j1(x) * log(x) - 1.0 / x);
  376. return (w);
  377. }
  378. w = 5.0 / x;
  379. z = w * w;
  380. p = polevl(z, PP, 6) / polevl(z, PQ, 6);
  381. q = polevl(z, QP, 7) / p1evl(z, QQ, 7);
  382. xn = x - THPIO4;
  383. p = p * sin(xn) + w * q * cos(xn);
  384. return (p * SQ2OPI / sqrt(x));
  385. }