j1.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  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 <math.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,
  93. 2.56987256757748830383E5,
  94. 8.35146791431949253037E7,
  95. 2.21511595479792499675E10,
  96. 4.74914122079991414898E12,
  97. 7.84369607876235854894E14,
  98. 8.95222336184627338078E16,
  99. 5.32278620332680085395E18,
  100. };
  101. #endif
  102. #ifdef DEC
  103. static unsigned short RP[16] = {
  104. 0147526,0110742,0063322,0077052,
  105. 0051722,0112720,0065034,0061530,
  106. 0153604,0052227,0033147,0105650,
  107. 0055121,0055025,0032276,0022015,
  108. };
  109. static unsigned short RQ[32] = {
  110. /*0040200,0000000,0000000,0000000,*/
  111. 0042433,0032610,0155604,0033473,
  112. 0044572,0173320,0067270,0006616,
  113. 0046637,0045246,0162225,0006606,
  114. 0050645,0004773,0157577,0053004,
  115. 0052612,0033734,0001667,0176501,
  116. 0054462,0054121,0173147,0121367,
  117. 0056237,0002777,0121451,0176007,
  118. 0057623,0136253,0131601,0044710,
  119. };
  120. #endif
  121. #ifdef IBMPC
  122. static unsigned short RP[16] = {
  123. 0x4fc5,0x4cda,0xd23c,0xc1ca,
  124. 0x8c6b,0x0d43,0x52ba,0x425a,
  125. 0xf175,0xe6cc,0x8a92,0xc2d0,
  126. 0xc482,0xa697,0x2b42,0x432a,
  127. };
  128. static unsigned short RQ[32] = {
  129. /*0x0000,0x0000,0x0000,0x3ff0,*/
  130. 0x86e7,0x1b70,0x66b1,0x4083,
  131. 0x01b2,0x0dd7,0x5eda,0x410f,
  132. 0xa1b1,0xdc92,0xe954,0x4193,
  133. 0xeac1,0x7bef,0xa13f,0x4214,
  134. 0xffa8,0x8076,0x46fb,0x4291,
  135. 0xf45f,0x3ecc,0x4b0a,0x4306,
  136. 0x3f81,0xf465,0xe0bf,0x4373,
  137. 0x2939,0x7670,0x7795,0x43d2,
  138. };
  139. #endif
  140. #ifdef MIEEE
  141. static unsigned short RP[16] = {
  142. 0xc1ca,0xd23c,0x4cda,0x4fc5,
  143. 0x425a,0x52ba,0x0d43,0x8c6b,
  144. 0xc2d0,0x8a92,0xe6cc,0xf175,
  145. 0x432a,0x2b42,0xa697,0xc482,
  146. };
  147. static unsigned short RQ[32] = {
  148. /*0x3ff0,0x0000,0x0000,0x0000,*/
  149. 0x4083,0x66b1,0x1b70,0x86e7,
  150. 0x410f,0x5eda,0x0dd7,0x01b2,
  151. 0x4193,0xe954,0xdc92,0xa1b1,
  152. 0x4214,0xa13f,0x7bef,0xeac1,
  153. 0x4291,0x46fb,0x8076,0xffa8,
  154. 0x4306,0x4b0a,0x3ecc,0xf45f,
  155. 0x4373,0xe0bf,0xf465,0x3f81,
  156. 0x43d2,0x7795,0x7670,0x2939,
  157. };
  158. #endif
  159. #ifdef UNK
  160. static double PP[7] = {
  161. 7.62125616208173112003E-4,
  162. 7.31397056940917570436E-2,
  163. 1.12719608129684925192E0,
  164. 5.11207951146807644818E0,
  165. 8.42404590141772420927E0,
  166. 5.21451598682361504063E0,
  167. 1.00000000000000000254E0,
  168. };
  169. static double PQ[7] = {
  170. 5.71323128072548699714E-4,
  171. 6.88455908754495404082E-2,
  172. 1.10514232634061696926E0,
  173. 5.07386386128601488557E0,
  174. 8.39985554327604159757E0,
  175. 5.20982848682361821619E0,
  176. 9.99999999999999997461E-1,
  177. };
  178. #endif
  179. #ifdef DEC
  180. static unsigned short PP[28] = {
  181. 0035507,0144542,0061543,0024326,
  182. 0037225,0145105,0017766,0022661,
  183. 0040220,0043766,0010254,0133255,
  184. 0040643,0113047,0142611,0151521,
  185. 0041006,0144344,0055351,0074261,
  186. 0040646,0156520,0120574,0006416,
  187. 0040200,0000000,0000000,0000000,
  188. };
  189. static unsigned short PQ[28] = {
  190. 0035425,0142330,0115041,0165514,
  191. 0037214,0177352,0145105,0052026,
  192. 0040215,0072515,0141207,0073255,
  193. 0040642,0056427,0137222,0106405,
  194. 0041006,0062716,0166427,0165450,
  195. 0040646,0133352,0035425,0123304,
  196. 0040200,0000000,0000000,0000000,
  197. };
  198. #endif
  199. #ifdef IBMPC
  200. static unsigned short PP[28] = {
  201. 0x651b,0x4c6c,0xf92c,0x3f48,
  202. 0xc4b6,0xa3fe,0xb948,0x3fb2,
  203. 0x96d6,0xc215,0x08fe,0x3ff2,
  204. 0x3a6a,0xf8b1,0x72c4,0x4014,
  205. 0x2f16,0x8b5d,0xd91c,0x4020,
  206. 0x81a2,0x142f,0xdbaa,0x4014,
  207. 0x0000,0x0000,0x0000,0x3ff0,
  208. };
  209. static unsigned short PQ[28] = {
  210. 0x3d69,0x1344,0xb89b,0x3f42,
  211. 0xaa83,0x5948,0x9fdd,0x3fb1,
  212. 0xeed6,0xb850,0xaea9,0x3ff1,
  213. 0x51a1,0xf7d2,0x4ba2,0x4014,
  214. 0xfd65,0xdda2,0xccb9,0x4020,
  215. 0xb4d9,0x4762,0xd6dd,0x4014,
  216. 0x0000,0x0000,0x0000,0x3ff0,
  217. };
  218. #endif
  219. #ifdef MIEEE
  220. static unsigned short PP[28] = {
  221. 0x3f48,0xf92c,0x4c6c,0x651b,
  222. 0x3fb2,0xb948,0xa3fe,0xc4b6,
  223. 0x3ff2,0x08fe,0xc215,0x96d6,
  224. 0x4014,0x72c4,0xf8b1,0x3a6a,
  225. 0x4020,0xd91c,0x8b5d,0x2f16,
  226. 0x4014,0xdbaa,0x142f,0x81a2,
  227. 0x3ff0,0x0000,0x0000,0x0000,
  228. };
  229. static unsigned short PQ[28] = {
  230. 0x3f42,0xb89b,0x1344,0x3d69,
  231. 0x3fb1,0x9fdd,0x5948,0xaa83,
  232. 0x3ff1,0xaea9,0xb850,0xeed6,
  233. 0x4014,0x4ba2,0xf7d2,0x51a1,
  234. 0x4020,0xccb9,0xdda2,0xfd65,
  235. 0x4014,0xd6dd,0x4762,0xb4d9,
  236. 0x3ff0,0x0000,0x0000,0x0000,
  237. };
  238. #endif
  239. #ifdef UNK
  240. static double QP[8] = {
  241. 5.10862594750176621635E-2,
  242. 4.98213872951233449420E0,
  243. 7.58238284132545283818E1,
  244. 3.66779609360150777800E2,
  245. 7.10856304998926107277E2,
  246. 5.97489612400613639965E2,
  247. 2.11688757100572135698E2,
  248. 2.52070205858023719784E1,
  249. };
  250. static double QQ[7] = {
  251. /* 1.00000000000000000000E0,*/
  252. 7.42373277035675149943E1,
  253. 1.05644886038262816351E3,
  254. 4.98641058337653607651E3,
  255. 9.56231892404756170795E3,
  256. 7.99704160447350683650E3,
  257. 2.82619278517639096600E3,
  258. 3.36093607810698293419E2,
  259. };
  260. #endif
  261. #ifdef DEC
  262. static unsigned short QP[32] = {
  263. 0037121,0037723,0055605,0151004,
  264. 0040637,0066656,0031554,0077264,
  265. 0041627,0122714,0153170,0161466,
  266. 0042267,0061712,0036520,0140145,
  267. 0042461,0133315,0131573,0071176,
  268. 0042425,0057525,0147500,0013201,
  269. 0042123,0130122,0061245,0154131,
  270. 0041311,0123772,0064254,0172650,
  271. };
  272. static unsigned short QQ[28] = {
  273. /*0040200,0000000,0000000,0000000,*/
  274. 0041624,0074603,0002112,0101670,
  275. 0042604,0007135,0010162,0175565,
  276. 0043233,0151510,0157757,0172010,
  277. 0043425,0064506,0112006,0104276,
  278. 0043371,0164125,0032271,0164242,
  279. 0043060,0121425,0122750,0136013,
  280. 0042250,0005773,0053472,0146267,
  281. };
  282. #endif
  283. #ifdef IBMPC
  284. static unsigned short QP[32] = {
  285. 0xba40,0x6b70,0x27fa,0x3faa,
  286. 0x8fd6,0xc66d,0xedb5,0x4013,
  287. 0x1c67,0x9acf,0xf4b9,0x4052,
  288. 0x180d,0x47aa,0xec79,0x4076,
  289. 0x6e50,0xb66f,0x36d9,0x4086,
  290. 0x02d0,0xb9e8,0xabea,0x4082,
  291. 0xbb0b,0x4c54,0x760a,0x406a,
  292. 0x9eb5,0x4d15,0x34ff,0x4039,
  293. };
  294. static unsigned short QQ[28] = {
  295. /*0x0000,0x0000,0x0000,0x3ff0,*/
  296. 0x5077,0x6089,0x8f30,0x4052,
  297. 0x5f6f,0xa20e,0x81cb,0x4090,
  298. 0xfe81,0x1bfd,0x7a69,0x40b3,
  299. 0xd118,0xd280,0xad28,0x40c2,
  300. 0x3d14,0xa697,0x3d0a,0x40bf,
  301. 0x1781,0xb4bd,0x1462,0x40a6,
  302. 0x5997,0x6ae7,0x017f,0x4075,
  303. };
  304. #endif
  305. #ifdef MIEEE
  306. static unsigned short QP[32] = {
  307. 0x3faa,0x27fa,0x6b70,0xba40,
  308. 0x4013,0xedb5,0xc66d,0x8fd6,
  309. 0x4052,0xf4b9,0x9acf,0x1c67,
  310. 0x4076,0xec79,0x47aa,0x180d,
  311. 0x4086,0x36d9,0xb66f,0x6e50,
  312. 0x4082,0xabea,0xb9e8,0x02d0,
  313. 0x406a,0x760a,0x4c54,0xbb0b,
  314. 0x4039,0x34ff,0x4d15,0x9eb5,
  315. };
  316. static unsigned short QQ[28] = {
  317. /*0x3ff0,0x0000,0x0000,0x0000,*/
  318. 0x4052,0x8f30,0x6089,0x5077,
  319. 0x4090,0x81cb,0xa20e,0x5f6f,
  320. 0x40b3,0x7a69,0x1bfd,0xfe81,
  321. 0x40c2,0xad28,0xd280,0xd118,
  322. 0x40bf,0x3d0a,0xa697,0x3d14,
  323. 0x40a6,0x1462,0xb4bd,0x1781,
  324. 0x4075,0x017f,0x6ae7,0x5997,
  325. };
  326. #endif
  327. #ifdef UNK
  328. static double YP[6] = {
  329. 1.26320474790178026440E9,
  330. -6.47355876379160291031E11,
  331. 1.14509511541823727583E14,
  332. -8.12770255501325109621E15,
  333. 2.02439475713594898196E17,
  334. -7.78877196265950026825E17,
  335. };
  336. static double YQ[8] = {
  337. /* 1.00000000000000000000E0,*/
  338. 5.94301592346128195359E2,
  339. 2.35564092943068577943E5,
  340. 7.34811944459721705660E7,
  341. 1.87601316108706159478E10,
  342. 3.88231277496238566008E12,
  343. 6.20557727146953693363E14,
  344. 6.87141087355300489866E16,
  345. 3.97270608116560655612E18,
  346. };
  347. #endif
  348. #ifdef DEC
  349. static unsigned short YP[24] = {
  350. 0047626,0112763,0013715,0133045,
  351. 0152026,0134552,0142033,0024411,
  352. 0053720,0045245,0102210,0077565,
  353. 0155347,0000321,0136415,0102031,
  354. 0056463,0146550,0055633,0032605,
  355. 0157054,0171012,0167361,0054265,
  356. };
  357. static unsigned short YQ[32] = {
  358. /*0040200,0000000,0000000,0000000,*/
  359. 0042424,0111515,0044773,0153014,
  360. 0044546,0005405,0171307,0075774,
  361. 0046614,0023575,0047105,0063556,
  362. 0050613,0143034,0101533,0156026,
  363. 0052541,0175367,0166514,0114257,
  364. 0054415,0014466,0134350,0171154,
  365. 0056164,0017436,0025075,0022101,
  366. 0057534,0103614,0103663,0121772,
  367. };
  368. #endif
  369. #ifdef IBMPC
  370. static unsigned short YP[24] = {
  371. 0xb6c5,0x62f9,0xd2be,0x41d2,
  372. 0x6521,0x5883,0xd72d,0xc262,
  373. 0x0fef,0xb091,0x0954,0x42da,
  374. 0xb083,0x37a1,0xe01a,0xc33c,
  375. 0x66b1,0x0b73,0x79ad,0x4386,
  376. 0x2b17,0x5dde,0x9e41,0xc3a5,
  377. };
  378. static unsigned short YQ[32] = {
  379. /*0x0000,0x0000,0x0000,0x3ff0,*/
  380. 0x7ac2,0xa93f,0x9269,0x4082,
  381. 0xef7f,0xbe58,0xc160,0x410c,
  382. 0xacee,0xa9c8,0x84ef,0x4191,
  383. 0x7b83,0x906b,0x78c3,0x4211,
  384. 0x9316,0xfda9,0x3f5e,0x428c,
  385. 0x1e4e,0xd71d,0xa326,0x4301,
  386. 0xa488,0xc547,0x83e3,0x436e,
  387. 0x747f,0x90f6,0x90f1,0x43cb,
  388. };
  389. #endif
  390. #ifdef MIEEE
  391. static unsigned short YP[24] = {
  392. 0x41d2,0xd2be,0x62f9,0xb6c5,
  393. 0xc262,0xd72d,0x5883,0x6521,
  394. 0x42da,0x0954,0xb091,0x0fef,
  395. 0xc33c,0xe01a,0x37a1,0xb083,
  396. 0x4386,0x79ad,0x0b73,0x66b1,
  397. 0xc3a5,0x9e41,0x5dde,0x2b17,
  398. };
  399. static unsigned short YQ[32] = {
  400. /*0x3ff0,0x0000,0x0000,0x0000,*/
  401. 0x4082,0x9269,0xa93f,0x7ac2,
  402. 0x410c,0xc160,0xbe58,0xef7f,
  403. 0x4191,0x84ef,0xa9c8,0xacee,
  404. 0x4211,0x78c3,0x906b,0x7b83,
  405. 0x428c,0x3f5e,0xfda9,0x9316,
  406. 0x4301,0xa326,0xd71d,0x1e4e,
  407. 0x436e,0x83e3,0xc547,0xa488,
  408. 0x43cb,0x90f1,0x90f6,0x747f,
  409. };
  410. #endif
  411. #ifdef UNK
  412. static double Z1 = 1.46819706421238932572E1;
  413. static double Z2 = 4.92184563216946036703E1;
  414. #endif
  415. #ifdef DEC
  416. static unsigned short DZ1[] = {0041152,0164532,0006114,0010540};
  417. static unsigned short DZ2[] = {0041504,0157663,0001625,0020621};
  418. #define Z1 (*(double *)DZ1)
  419. #define Z2 (*(double *)DZ2)
  420. #endif
  421. #ifdef IBMPC
  422. static unsigned short DZ1[] = {0x822c,0x4189,0x5d2b,0x402d};
  423. static unsigned short DZ2[] = {0xa432,0x6072,0x9bf6,0x4048};
  424. #define Z1 (*(double *)DZ1)
  425. #define Z2 (*(double *)DZ2)
  426. #endif
  427. #ifdef MIEEE
  428. static unsigned short DZ1[] = {0x402d,0x5d2b,0x4189,0x822c};
  429. static unsigned short DZ2[] = {0x4048,0x9bf6,0x6072,0xa432};
  430. #define Z1 (*(double *)DZ1)
  431. #define Z2 (*(double *)DZ2)
  432. #endif
  433. #ifdef ANSIPROT
  434. extern double polevl ( double, void *, int );
  435. extern double p1evl ( double, void *, int );
  436. extern double log ( double );
  437. extern double sin ( double );
  438. extern double cos ( double );
  439. extern double sqrt ( double );
  440. double j1 ( double );
  441. #else
  442. double polevl(), p1evl(), log(), sin(), cos(), sqrt();
  443. double j1();
  444. #endif
  445. extern double TWOOPI, THPIO4, SQ2OPI;
  446. double j1(x)
  447. double x;
  448. {
  449. double w, z, p, q, xn;
  450. w = x;
  451. if( x < 0 )
  452. w = -x;
  453. if( w <= 5.0 )
  454. {
  455. z = x * x;
  456. w = polevl( z, RP, 3 ) / p1evl( z, RQ, 8 );
  457. w = w * x * (z - Z1) * (z - Z2);
  458. return( w );
  459. }
  460. w = 5.0/x;
  461. z = w * w;
  462. p = polevl( z, PP, 6)/polevl( z, PQ, 6 );
  463. q = polevl( z, QP, 7)/p1evl( z, QQ, 7 );
  464. xn = x - THPIO4;
  465. p = p * cos(xn) - w * q * sin(xn);
  466. return( p * SQ2OPI / sqrt(x) );
  467. }
  468. extern double MAXNUM;
  469. double y1(x)
  470. double x;
  471. {
  472. double w, z, p, q, xn;
  473. if( x <= 5.0 )
  474. {
  475. if( x <= 0.0 )
  476. {
  477. mtherr( "y1", DOMAIN );
  478. return( -MAXNUM );
  479. }
  480. z = x * x;
  481. w = x * (polevl( z, YP, 5 ) / p1evl( z, YQ, 8 ));
  482. w += TWOOPI * ( j1(x) * log(x) - 1.0/x );
  483. return( w );
  484. }
  485. w = 5.0/x;
  486. z = w * w;
  487. p = polevl( z, PP, 6)/polevl( z, PQ, 6 );
  488. q = polevl( z, QP, 7)/p1evl( z, QQ, 7 );
  489. xn = x - THPIO4;
  490. p = p * sin(xn) + w * q * cos(xn);
  491. return( p * SQ2OPI / sqrt(x) );
  492. }