sici.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. /* sici.c
  2. *
  3. * Sine and cosine integrals
  4. *
  5. *
  6. *
  7. * SYNOPSIS:
  8. *
  9. * double x, Ci, Si, sici();
  10. *
  11. * sici( x, &Si, &Ci );
  12. *
  13. *
  14. * DESCRIPTION:
  15. *
  16. * Evaluates the integrals
  17. *
  18. * x
  19. * -
  20. * | cos t - 1
  21. * Ci(x) = eul + ln x + | --------- dt,
  22. * | t
  23. * -
  24. * 0
  25. * x
  26. * -
  27. * | sin t
  28. * Si(x) = | ----- dt
  29. * | t
  30. * -
  31. * 0
  32. *
  33. * where eul = 0.57721566490153286061 is Euler's constant.
  34. * The integrals are approximated by rational functions.
  35. * For x > 8 auxiliary functions f(x) and g(x) are employed
  36. * such that
  37. *
  38. * Ci(x) = f(x) sin(x) - g(x) cos(x)
  39. * Si(x) = pi/2 - f(x) cos(x) - g(x) sin(x)
  40. *
  41. *
  42. * ACCURACY:
  43. * Test interval = [0,50].
  44. * Absolute error, except relative when > 1:
  45. * arithmetic function # trials peak rms
  46. * IEEE Si 30000 4.4e-16 7.3e-17
  47. * IEEE Ci 30000 6.9e-16 5.1e-17
  48. * DEC Si 5000 4.4e-17 9.0e-18
  49. * DEC Ci 5300 7.9e-17 5.2e-18
  50. */
  51. /*
  52. Cephes Math Library Release 2.1: January, 1989
  53. Copyright 1984, 1987, 1989 by Stephen L. Moshier
  54. Direct inquiries to 30 Frost Street, Cambridge, MA 02140
  55. */
  56. #include <math.h>
  57. #ifdef UNK
  58. static double SN[] = {
  59. -8.39167827910303881427E-11,
  60. 4.62591714427012837309E-8,
  61. -9.75759303843632795789E-6,
  62. 9.76945438170435310816E-4,
  63. -4.13470316229406538752E-2,
  64. 1.00000000000000000302E0,
  65. };
  66. static double SD[] = {
  67. 2.03269266195951942049E-12,
  68. 1.27997891179943299903E-9,
  69. 4.41827842801218905784E-7,
  70. 9.96412122043875552487E-5,
  71. 1.42085239326149893930E-2,
  72. 9.99999999999999996984E-1,
  73. };
  74. #endif
  75. #ifdef DEC
  76. static unsigned short SN[] = {
  77. 0127670,0104362,0167505,0035161,
  78. 0032106,0127177,0032131,0056461,
  79. 0134043,0132213,0000476,0172351,
  80. 0035600,0006331,0064761,0032665,
  81. 0137051,0055601,0044667,0017645,
  82. 0040200,0000000,0000000,0000000,
  83. };
  84. static unsigned short SD[] = {
  85. 0026417,0004674,0052064,0001573,
  86. 0030657,0165501,0014666,0131526,
  87. 0032755,0032133,0034147,0024124,
  88. 0034720,0173167,0166624,0154477,
  89. 0036550,0145336,0063534,0063220,
  90. 0040200,0000000,0000000,0000000,
  91. };
  92. #endif
  93. #ifdef IBMPC
  94. static unsigned short SN[] = {
  95. 0xa74e,0x5de8,0x111e,0xbdd7,
  96. 0x2ba6,0xe68b,0xd5cf,0x3e68,
  97. 0xde9d,0x6027,0x7691,0xbee4,
  98. 0x26b7,0x2d3e,0x019b,0x3f50,
  99. 0xe3f5,0x2936,0x2b70,0xbfa5,
  100. 0x0000,0x0000,0x0000,0x3ff0,
  101. };
  102. static unsigned short SD[] = {
  103. 0x806f,0x8a86,0xe137,0x3d81,
  104. 0xd66b,0x2336,0xfd68,0x3e15,
  105. 0xe50a,0x670c,0xa68b,0x3e9d,
  106. 0x9b28,0xfdb2,0x1ece,0x3f1a,
  107. 0x8cd2,0xcceb,0x195b,0x3f8d,
  108. 0x0000,0x0000,0x0000,0x3ff0,
  109. };
  110. #endif
  111. #ifdef MIEEE
  112. static unsigned short SN[] = {
  113. 0xbdd7,0x111e,0x5de8,0xa74e,
  114. 0x3e68,0xd5cf,0xe68b,0x2ba6,
  115. 0xbee4,0x7691,0x6027,0xde9d,
  116. 0x3f50,0x019b,0x2d3e,0x26b7,
  117. 0xbfa5,0x2b70,0x2936,0xe3f5,
  118. 0x3ff0,0x0000,0x0000,0x0000,
  119. };
  120. static unsigned short SD[] = {
  121. 0x3d81,0xe137,0x8a86,0x806f,
  122. 0x3e15,0xfd68,0x2336,0xd66b,
  123. 0x3e9d,0xa68b,0x670c,0xe50a,
  124. 0x3f1a,0x1ece,0xfdb2,0x9b28,
  125. 0x3f8d,0x195b,0xcceb,0x8cd2,
  126. 0x3ff0,0x0000,0x0000,0x0000,
  127. };
  128. #endif
  129. #ifdef UNK
  130. static double CN[] = {
  131. 2.02524002389102268789E-11,
  132. -1.35249504915790756375E-8,
  133. 3.59325051419993077021E-6,
  134. -4.74007206873407909465E-4,
  135. 2.89159652607555242092E-2,
  136. -1.00000000000000000080E0,
  137. };
  138. static double CD[] = {
  139. 4.07746040061880559506E-12,
  140. 3.06780997581887812692E-9,
  141. 1.23210355685883423679E-6,
  142. 3.17442024775032769882E-4,
  143. 5.10028056236446052392E-2,
  144. 4.00000000000000000080E0,
  145. };
  146. #endif
  147. #ifdef DEC
  148. static unsigned short CN[] = {
  149. 0027262,0022131,0160257,0020166,
  150. 0131550,0055534,0077637,0000557,
  151. 0033561,0021622,0161463,0026575,
  152. 0135370,0102053,0116333,0000466,
  153. 0036754,0160454,0122022,0024622,
  154. 0140200,0000000,0000000,0000000,
  155. };
  156. static unsigned short CD[] = {
  157. 0026617,0073177,0107543,0104425,
  158. 0031122,0150573,0156453,0041517,
  159. 0033245,0057301,0077706,0110510,
  160. 0035246,0067130,0165424,0044543,
  161. 0037120,0164121,0061206,0053657,
  162. 0040600,0000000,0000000,0000000,
  163. };
  164. #endif
  165. #ifdef IBMPC
  166. static unsigned short CN[] = {
  167. 0xe40f,0x3c15,0x448b,0x3db6,
  168. 0xe02e,0x8ff3,0x0b6b,0xbe4d,
  169. 0x65b0,0x5c66,0x2472,0x3ece,
  170. 0x6027,0x739b,0x1085,0xbf3f,
  171. 0x4532,0x9482,0x9c25,0x3f9d,
  172. 0x0000,0x0000,0x0000,0xbff0,
  173. };
  174. static unsigned short CD[] = {
  175. 0x7123,0xf1ec,0xeecf,0x3d91,
  176. 0x686a,0x7ba5,0x5a2f,0x3e2a,
  177. 0xd229,0x2ff8,0xabd8,0x3eb4,
  178. 0x892c,0x1d62,0xcdcb,0x3f34,
  179. 0xcaf6,0x2c50,0x1d0a,0x3faa,
  180. 0x0000,0x0000,0x0000,0x4010,
  181. };
  182. #endif
  183. #ifdef MIEEE
  184. static unsigned short CN[] = {
  185. 0x3db6,0x448b,0x3c15,0xe40f,
  186. 0xbe4d,0x0b6b,0x8ff3,0xe02e,
  187. 0x3ece,0x2472,0x5c66,0x65b0,
  188. 0xbf3f,0x1085,0x739b,0x6027,
  189. 0x3f9d,0x9c25,0x9482,0x4532,
  190. 0xbff0,0x0000,0x0000,0x0000,
  191. };
  192. static unsigned short CD[] = {
  193. 0x3d91,0xeecf,0xf1ec,0x7123,
  194. 0x3e2a,0x5a2f,0x7ba5,0x686a,
  195. 0x3eb4,0xabd8,0x2ff8,0xd229,
  196. 0x3f34,0xcdcb,0x1d62,0x892c,
  197. 0x3faa,0x1d0a,0x2c50,0xcaf6,
  198. 0x4010,0x0000,0x0000,0x0000,
  199. };
  200. #endif
  201. #ifdef UNK
  202. static double FN4[] = {
  203. 4.23612862892216586994E0,
  204. 5.45937717161812843388E0,
  205. 1.62083287701538329132E0,
  206. 1.67006611831323023771E-1,
  207. 6.81020132472518137426E-3,
  208. 1.08936580650328664411E-4,
  209. 5.48900223421373614008E-7,
  210. };
  211. static double FD4[] = {
  212. /* 1.00000000000000000000E0,*/
  213. 8.16496634205391016773E0,
  214. 7.30828822505564552187E0,
  215. 1.86792257950184183883E0,
  216. 1.78792052963149907262E-1,
  217. 7.01710668322789753610E-3,
  218. 1.10034357153915731354E-4,
  219. 5.48900252756255700982E-7,
  220. };
  221. #endif
  222. #ifdef DEC
  223. static unsigned short FN4[] = {
  224. 0040607,0107135,0120133,0153471,
  225. 0040656,0131467,0140424,0017567,
  226. 0040317,0073563,0121610,0002511,
  227. 0037453,0001710,0000040,0006334,
  228. 0036337,0024033,0176003,0171425,
  229. 0034744,0072341,0121657,0126035,
  230. 0033023,0054042,0154652,0000451,
  231. };
  232. static unsigned short FD4[] = {
  233. /*0040200,0000000,0000000,0000000,*/
  234. 0041002,0121663,0137500,0177450,
  235. 0040751,0156577,0042213,0061552,
  236. 0040357,0014026,0045465,0147265,
  237. 0037467,0012503,0110413,0131772,
  238. 0036345,0167701,0155706,0160551,
  239. 0034746,0141076,0162250,0123547,
  240. 0033023,0054043,0056706,0151050,
  241. };
  242. #endif
  243. #ifdef IBMPC
  244. static unsigned short FN4[] = {
  245. 0x7ae7,0xb40b,0xf1cb,0x4010,
  246. 0x83ef,0xf822,0xd666,0x4015,
  247. 0x00a9,0x7471,0xeeee,0x3ff9,
  248. 0x019c,0x0004,0x6079,0x3fc5,
  249. 0x7e63,0x7f80,0xe503,0x3f7b,
  250. 0xf584,0x3475,0x8e9c,0x3f1c,
  251. 0x4025,0x5b35,0x6b04,0x3ea2,
  252. };
  253. static unsigned short FD4[] = {
  254. /*0x0000,0x0000,0x0000,0x3ff0,*/
  255. 0x1fe5,0x77e8,0x5476,0x4020,
  256. 0x6c6d,0xe891,0x3baf,0x401d,
  257. 0xb9d7,0xc966,0xe302,0x3ffd,
  258. 0x767f,0x7221,0xe2a8,0x3fc6,
  259. 0xdc2d,0x3b78,0xbdf8,0x3f7c,
  260. 0x14ed,0xdc95,0xd847,0x3f1c,
  261. 0xda45,0x6bb8,0x6b04,0x3ea2,
  262. };
  263. #endif
  264. #ifdef MIEEE
  265. static unsigned short FN4[] = {
  266. 0x4010,0xf1cb,0xb40b,0x7ae7,
  267. 0x4015,0xd666,0xf822,0x83ef,
  268. 0x3ff9,0xeeee,0x7471,0x00a9,
  269. 0x3fc5,0x6079,0x0004,0x019c,
  270. 0x3f7b,0xe503,0x7f80,0x7e63,
  271. 0x3f1c,0x8e9c,0x3475,0xf584,
  272. 0x3ea2,0x6b04,0x5b35,0x4025,
  273. };
  274. static unsigned short FD4[] = {
  275. /* 0x3ff0,0x0000,0x0000,0x0000,*/
  276. 0x4020,0x5476,0x77e8,0x1fe5,
  277. 0x401d,0x3baf,0xe891,0x6c6d,
  278. 0x3ffd,0xe302,0xc966,0xb9d7,
  279. 0x3fc6,0xe2a8,0x7221,0x767f,
  280. 0x3f7c,0xbdf8,0x3b78,0xdc2d,
  281. 0x3f1c,0xd847,0xdc95,0x14ed,
  282. 0x3ea2,0x6b04,0x6bb8,0xda45,
  283. };
  284. #endif
  285. #ifdef UNK
  286. static double FN8[] = {
  287. 4.55880873470465315206E-1,
  288. 7.13715274100146711374E-1,
  289. 1.60300158222319456320E-1,
  290. 1.16064229408124407915E-2,
  291. 3.49556442447859055605E-4,
  292. 4.86215430826454749482E-6,
  293. 3.20092790091004902806E-8,
  294. 9.41779576128512936592E-11,
  295. 9.70507110881952024631E-14,
  296. };
  297. static double FD8[] = {
  298. /* 1.00000000000000000000E0,*/
  299. 9.17463611873684053703E-1,
  300. 1.78685545332074536321E-1,
  301. 1.22253594771971293032E-2,
  302. 3.58696481881851580297E-4,
  303. 4.92435064317881464393E-6,
  304. 3.21956939101046018377E-8,
  305. 9.43720590350276732376E-11,
  306. 9.70507110881952025725E-14,
  307. };
  308. #endif
  309. #ifdef DEC
  310. static unsigned short FN8[] = {
  311. 0037751,0064467,0142332,0164573,
  312. 0040066,0133013,0050352,0071102,
  313. 0037444,0022671,0102157,0013535,
  314. 0036476,0024335,0136423,0146444,
  315. 0035267,0042253,0164110,0110460,
  316. 0033643,0022626,0062535,0060320,
  317. 0032011,0075223,0010110,0153413,
  318. 0027717,0014572,0011360,0014034,
  319. 0025332,0104755,0004563,0152354,
  320. };
  321. static unsigned short FD8[] = {
  322. /*0040200,0000000,0000000,0000000,*/
  323. 0040152,0157345,0030104,0075616,
  324. 0037466,0174527,0172740,0071060,
  325. 0036510,0046337,0144272,0156552,
  326. 0035274,0007555,0042537,0015572,
  327. 0033645,0035731,0112465,0026474,
  328. 0032012,0043612,0030613,0030123,
  329. 0027717,0103277,0004564,0151000,
  330. 0025332,0104755,0004563,0152354,
  331. };
  332. #endif
  333. #ifdef IBMPC
  334. static unsigned short FN8[] = {
  335. 0x5d2f,0xf89b,0x2d26,0x3fdd,
  336. 0x4e48,0x6a1d,0xd6c1,0x3fe6,
  337. 0xe2ec,0x308d,0x84b7,0x3fc4,
  338. 0x79a4,0xb7a2,0xc51b,0x3f87,
  339. 0x1226,0x7d09,0xe895,0x3f36,
  340. 0xac1a,0xccab,0x64b2,0x3ed4,
  341. 0x1ae1,0x6209,0x2f52,0x3e61,
  342. 0x0304,0x425e,0xe32f,0x3dd9,
  343. 0x7a9d,0xa12e,0x513d,0x3d3b,
  344. };
  345. static unsigned short FD8[] = {
  346. /*0x0000,0x0000,0x0000,0x3ff0,*/
  347. 0x8f72,0xa608,0x5bdc,0x3fed,
  348. 0x0e46,0xfebc,0xdf2a,0x3fc6,
  349. 0x5bad,0xf917,0x099b,0x3f89,
  350. 0xe36f,0xa8ab,0x81ed,0x3f37,
  351. 0xa5a8,0x32a6,0xa77b,0x3ed4,
  352. 0x660a,0x4631,0x48f1,0x3e61,
  353. 0x9a40,0xe12e,0xf0d7,0x3dd9,
  354. 0x7a9d,0xa12e,0x513d,0x3d3b,
  355. };
  356. #endif
  357. #ifdef MIEEE
  358. static unsigned short FN8[] = {
  359. 0x3fdd,0x2d26,0xf89b,0x5d2f,
  360. 0x3fe6,0xd6c1,0x6a1d,0x4e48,
  361. 0x3fc4,0x84b7,0x308d,0xe2ec,
  362. 0x3f87,0xc51b,0xb7a2,0x79a4,
  363. 0x3f36,0xe895,0x7d09,0x1226,
  364. 0x3ed4,0x64b2,0xccab,0xac1a,
  365. 0x3e61,0x2f52,0x6209,0x1ae1,
  366. 0x3dd9,0xe32f,0x425e,0x0304,
  367. 0x3d3b,0x513d,0xa12e,0x7a9d,
  368. };
  369. static unsigned short FD8[] = {
  370. /*0x3ff0,0x0000,0x0000,0x0000,*/
  371. 0x3fed,0x5bdc,0xa608,0x8f72,
  372. 0x3fc6,0xdf2a,0xfebc,0x0e46,
  373. 0x3f89,0x099b,0xf917,0x5bad,
  374. 0x3f37,0x81ed,0xa8ab,0xe36f,
  375. 0x3ed4,0xa77b,0x32a6,0xa5a8,
  376. 0x3e61,0x48f1,0x4631,0x660a,
  377. 0x3dd9,0xf0d7,0xe12e,0x9a40,
  378. 0x3d3b,0x513d,0xa12e,0x7a9d,
  379. };
  380. #endif
  381. #ifdef UNK
  382. static double GN4[] = {
  383. 8.71001698973114191777E-2,
  384. 6.11379109952219284151E-1,
  385. 3.97180296392337498885E-1,
  386. 7.48527737628469092119E-2,
  387. 5.38868681462177273157E-3,
  388. 1.61999794598934024525E-4,
  389. 1.97963874140963632189E-6,
  390. 7.82579040744090311069E-9,
  391. };
  392. static double GD4[] = {
  393. /* 1.00000000000000000000E0,*/
  394. 1.64402202413355338886E0,
  395. 6.66296701268987968381E-1,
  396. 9.88771761277688796203E-2,
  397. 6.22396345441768420760E-3,
  398. 1.73221081474177119497E-4,
  399. 2.02659182086343991969E-6,
  400. 7.82579218933534490868E-9,
  401. };
  402. #endif
  403. #ifdef DEC
  404. static unsigned short GN4[] = {
  405. 0037262,0060622,0164572,0157515,
  406. 0040034,0101527,0061263,0147204,
  407. 0037713,0055467,0037475,0144512,
  408. 0037231,0046151,0035234,0045261,
  409. 0036260,0111624,0150617,0053536,
  410. 0035051,0157175,0016675,0155456,
  411. 0033404,0154757,0041211,0000055,
  412. 0031406,0071060,0130322,0033322,
  413. };
  414. static unsigned short GD4[] = {
  415. /* 0040200,0000000,0000000,0000000,*/
  416. 0040322,0067520,0046707,0053275,
  417. 0040052,0111153,0126542,0005516,
  418. 0037312,0100035,0167121,0014552,
  419. 0036313,0171143,0137176,0014213,
  420. 0035065,0121256,0012033,0150603,
  421. 0033410,0000225,0013121,0071643,
  422. 0031406,0071062,0131152,0150454,
  423. };
  424. #endif
  425. #ifdef IBMPC
  426. static unsigned short GN4[] = {
  427. 0x5bea,0x5d2f,0x4c32,0x3fb6,
  428. 0x79d1,0xec56,0x906a,0x3fe3,
  429. 0xb929,0xe7e7,0x6b66,0x3fd9,
  430. 0x8956,0x2753,0x298d,0x3fb3,
  431. 0xeaec,0x9a31,0x1272,0x3f76,
  432. 0xbb66,0xa3b7,0x3bcf,0x3f25,
  433. 0x2006,0xe851,0x9b3d,0x3ec0,
  434. 0x46da,0x161a,0xce46,0x3e40,
  435. };
  436. static unsigned short GD4[] = {
  437. /* 0x0000,0x0000,0x0000,0x3ff0,*/
  438. 0xead8,0x09b8,0x4dea,0x3ffa,
  439. 0x416a,0x75ac,0x524d,0x3fe5,
  440. 0x232d,0xbdca,0x5003,0x3fb9,
  441. 0xc311,0x77cf,0x7e4c,0x3f79,
  442. 0x7a30,0xc283,0xb455,0x3f26,
  443. 0x2e74,0xa2ca,0x0012,0x3ec1,
  444. 0x5a26,0x564d,0xce46,0x3e40,
  445. };
  446. #endif
  447. #ifdef MIEEE
  448. static unsigned short GN4[] = {
  449. 0x3fb6,0x4c32,0x5d2f,0x5bea,
  450. 0x3fe3,0x906a,0xec56,0x79d1,
  451. 0x3fd9,0x6b66,0xe7e7,0xb929,
  452. 0x3fb3,0x298d,0x2753,0x8956,
  453. 0x3f76,0x1272,0x9a31,0xeaec,
  454. 0x3f25,0x3bcf,0xa3b7,0xbb66,
  455. 0x3ec0,0x9b3d,0xe851,0x2006,
  456. 0x3e40,0xce46,0x161a,0x46da,
  457. };
  458. static unsigned short GD4[] = {
  459. /*0x3ff0,0x0000,0x0000,0x0000,*/
  460. 0x3ffa,0x4dea,0x09b8,0xead8,
  461. 0x3fe5,0x524d,0x75ac,0x416a,
  462. 0x3fb9,0x5003,0xbdca,0x232d,
  463. 0x3f79,0x7e4c,0x77cf,0xc311,
  464. 0x3f26,0xb455,0xc283,0x7a30,
  465. 0x3ec1,0x0012,0xa2ca,0x2e74,
  466. 0x3e40,0xce46,0x564d,0x5a26,
  467. };
  468. #endif
  469. #ifdef UNK
  470. static double GN8[] = {
  471. 6.97359953443276214934E-1,
  472. 3.30410979305632063225E-1,
  473. 3.84878767649974295920E-2,
  474. 1.71718239052347903558E-3,
  475. 3.48941165502279436777E-5,
  476. 3.47131167084116673800E-7,
  477. 1.70404452782044526189E-9,
  478. 3.85945925430276600453E-12,
  479. 3.14040098946363334640E-15,
  480. };
  481. static double GD8[] = {
  482. /* 1.00000000000000000000E0,*/
  483. 1.68548898811011640017E0,
  484. 4.87852258695304967486E-1,
  485. 4.67913194259625806320E-2,
  486. 1.90284426674399523638E-3,
  487. 3.68475504442561108162E-5,
  488. 3.57043223443740838771E-7,
  489. 1.72693748966316146736E-9,
  490. 3.87830166023954706752E-12,
  491. 3.14040098946363335242E-15,
  492. };
  493. #endif
  494. #ifdef DEC
  495. static unsigned short GN8[] = {
  496. 0040062,0103056,0110624,0033123,
  497. 0037651,0025640,0136266,0145647,
  498. 0037035,0122566,0137770,0061777,
  499. 0035741,0011424,0065311,0013370,
  500. 0034422,0055505,0134324,0016755,
  501. 0032672,0056530,0022565,0014747,
  502. 0030752,0031674,0114735,0013162,
  503. 0026607,0145353,0022020,0123625,
  504. 0024142,0045054,0060033,0016505,
  505. };
  506. static unsigned short GD8[] = {
  507. /*0040200,0000000,0000000,0000000,*/
  508. 0040327,0137032,0064331,0136425,
  509. 0037771,0143705,0070300,0105711,
  510. 0037077,0124101,0025275,0035356,
  511. 0035771,0064333,0145103,0105357,
  512. 0034432,0106301,0105311,0010713,
  513. 0032677,0127645,0120034,0157551,
  514. 0030755,0054466,0010743,0105566,
  515. 0026610,0072242,0142530,0135744,
  516. 0024142,0045054,0060033,0016505,
  517. };
  518. #endif
  519. #ifdef IBMPC
  520. static unsigned short GN8[] = {
  521. 0x86ca,0xd232,0x50c5,0x3fe6,
  522. 0xd975,0x1796,0x2574,0x3fd5,
  523. 0x0c80,0xd7ff,0xb4ae,0x3fa3,
  524. 0x22df,0x8d59,0x2262,0x3f5c,
  525. 0x83be,0xb71a,0x4b68,0x3f02,
  526. 0xa33d,0x04ae,0x4bab,0x3e97,
  527. 0xa2ce,0x933b,0x4677,0x3e1d,
  528. 0x14f3,0x6482,0xf95d,0x3d90,
  529. 0x63a9,0x8c03,0x4945,0x3cec,
  530. };
  531. static unsigned short GD8[] = {
  532. /*0x0000,0x0000,0x0000,0x3ff0,*/
  533. 0x37a3,0x4d1b,0xf7c3,0x3ffa,
  534. 0x1179,0xae18,0x38f8,0x3fdf,
  535. 0xa75e,0x2557,0xf508,0x3fa7,
  536. 0x715e,0x7948,0x2d1b,0x3f5f,
  537. 0x2239,0x3159,0x5198,0x3f03,
  538. 0x9bed,0xb403,0xf5f4,0x3e97,
  539. 0x716f,0xc23c,0xab26,0x3e1d,
  540. 0x177c,0x58ab,0x0e94,0x3d91,
  541. 0x63a9,0x8c03,0x4945,0x3cec,
  542. };
  543. #endif
  544. #ifdef MIEEE
  545. static unsigned short GN8[] = {
  546. 0x3fe6,0x50c5,0xd232,0x86ca,
  547. 0x3fd5,0x2574,0x1796,0xd975,
  548. 0x3fa3,0xb4ae,0xd7ff,0x0c80,
  549. 0x3f5c,0x2262,0x8d59,0x22df,
  550. 0x3f02,0x4b68,0xb71a,0x83be,
  551. 0x3e97,0x4bab,0x04ae,0xa33d,
  552. 0x3e1d,0x4677,0x933b,0xa2ce,
  553. 0x3d90,0xf95d,0x6482,0x14f3,
  554. 0x3cec,0x4945,0x8c03,0x63a9,
  555. };
  556. static unsigned short GD8[] = {
  557. /*0x3ff0,0x0000,0x0000,0x0000,*/
  558. 0x3ffa,0xf7c3,0x4d1b,0x37a3,
  559. 0x3fdf,0x38f8,0xae18,0x1179,
  560. 0x3fa7,0xf508,0x2557,0xa75e,
  561. 0x3f5f,0x2d1b,0x7948,0x715e,
  562. 0x3f03,0x5198,0x3159,0x2239,
  563. 0x3e97,0xf5f4,0xb403,0x9bed,
  564. 0x3e1d,0xab26,0xc23c,0x716f,
  565. 0x3d91,0x0e94,0x58ab,0x177c,
  566. 0x3cec,0x4945,0x8c03,0x63a9,
  567. };
  568. #endif
  569. #ifdef ANSIPROT
  570. extern double log ( double );
  571. extern double sin ( double );
  572. extern double cos ( double );
  573. extern double polevl ( double, void *, int );
  574. extern double p1evl ( double, void *, int );
  575. #else
  576. double log(), sin(), cos(), polevl(), p1evl();
  577. #endif
  578. #define EUL 0.57721566490153286061
  579. extern double MAXNUM, PIO2, MACHEP;
  580. int sici( x, si, ci )
  581. double x;
  582. double *si, *ci;
  583. {
  584. double z, c, s, f, g;
  585. short sign;
  586. if( x < 0.0 )
  587. {
  588. sign = -1;
  589. x = -x;
  590. }
  591. else
  592. sign = 0;
  593. if( x == 0.0 )
  594. {
  595. *si = 0.0;
  596. *ci = -MAXNUM;
  597. return( 0 );
  598. }
  599. if( x > 1.0e9 )
  600. {
  601. *si = PIO2 - cos(x)/x;
  602. *ci = sin(x)/x;
  603. return( 0 );
  604. }
  605. if( x > 4.0 )
  606. goto asympt;
  607. z = x * x;
  608. s = x * polevl( z, SN, 5 ) / polevl( z, SD, 5 );
  609. c = z * polevl( z, CN, 5 ) / polevl( z, CD, 5 );
  610. if( sign )
  611. s = -s;
  612. *si = s;
  613. *ci = EUL + log(x) + c; /* real part if x < 0 */
  614. return(0);
  615. /* The auxiliary functions are:
  616. *
  617. *
  618. * *si = *si - PIO2;
  619. * c = cos(x);
  620. * s = sin(x);
  621. *
  622. * t = *ci * s - *si * c;
  623. * a = *ci * c + *si * s;
  624. *
  625. * *si = t;
  626. * *ci = -a;
  627. */
  628. asympt:
  629. s = sin(x);
  630. c = cos(x);
  631. z = 1.0/(x*x);
  632. if( x < 8.0 )
  633. {
  634. f = polevl( z, FN4, 6 ) / (x * p1evl( z, FD4, 7 ));
  635. g = z * polevl( z, GN4, 7 ) / p1evl( z, GD4, 7 );
  636. }
  637. else
  638. {
  639. f = polevl( z, FN8, 8 ) / (x * p1evl( z, FD8, 8 ));
  640. g = z * polevl( z, GN8, 8 ) / p1evl( z, GD8, 9 );
  641. }
  642. *si = PIO2 - f * c - g * s;
  643. if( sign )
  644. *si = -( *si );
  645. *ci = f * s - g * c;
  646. return(0);
  647. }