ansiMath.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:80k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ansiMath.c - ANSI `math' documentation */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,23may01,to   doc fix for frexp()
  7. 01j,03jan01,pes  Fix compiler warnings.
  8. 01i,04feb99,dgp  document errno values.
  9. 01h,19mar95,dvs  removed TRON reference - no longer supported.
  10. 01g,10feb95,rhp  update from subsidiary files
  11. 01f,16jan95,rhp  library man page: correct spelling of HUGE_VAL
  12. 01e,13mar93,jdi  doc tweak.
  13. 01d,05feb93,jdi  doc changes based on kdl review.
  14. 01c,02dec92,jdi  doc tweaks.
  15. 01b,28oct92,jdi  updated with new versions of .c files
  16. 01a,24oct92,smb  documentation
  17. */
  18. /*
  19. DESCRIPTION
  20. The header math.h declares several mathematical functions and defines one
  21. macro.  The functions take double arguments and return double values.
  22. The macro defined is:
  23. .iP `HUGE_VAL' 15
  24. expands to a positive double expression, not necessarily representable
  25. as a float.
  26. .LP
  27. The behavior of each of these functions is defined for all representable
  28. values of their input arguments.  Each function executes as if it were a
  29. single operation, without generating any externally visible exceptions.
  30. For all functions, a domain error occurs if an input argument is outside
  31. the domain over which the mathematical function is defined.  The
  32. description of each function lists any applicable domain errors.  On a
  33. domain error, the function returns an implementation-defined value; the
  34. value EDOM is stored in `errno'.
  35. Similarly, a range error occurs if the result of the function cannot be
  36. represented as a double value.  If the result overflows (the magnitude of
  37. the result is so large that it cannot be represented in an object of the
  38. specified type), the function returns the value HUGE_VAL, with the same
  39. sign (except for the tan() function) as the correct value of the function;
  40. the value ERANGE is stored in `errno'.  If the result underflows (the
  41. type), the function returns zero; whether the integer expression `errno'
  42. acquires the value ERANGE is implementation defined.
  43. INCLUDE FILES: math.h
  44. SEE ALSO: mathALib, American National Standard X3.159-1989
  45. INTERNAL
  46. When generating man pages, the man pages from this library should be
  47. built AFTER those from arch/mc68k/math/mathALib.  Thus, where there are
  48. equivalent man pages in both ansiMath and mathALib, the ones in ansiMath
  49. will overwrite those from mathALib, which is the correct behavior.
  50. This ordering is set up in the overall makefile system.
  51. INTERNAL
  52. This module is built by appending the following files:
  53.     asincos.c
  54.     atan.c
  55.     atan2.c
  56.     ceil.c
  57.     cosh.c
  58.     exp.c
  59.     fabs.c
  60.     floor.c
  61.     fmod.c
  62.     frexp.c
  63.     ldexp.c
  64.     log.c
  65.     log10.c
  66.     modf.c
  67.     pow.c
  68.     sincos.c
  69.     sinh.c
  70.     sqrt.c
  71.     tan.c
  72.     tanh.c
  73. */
  74. /* asincos.c - inverse sine and cosine math routines */
  75. /* Copyright 1992-1994 Wind River Systems, Inc. */
  76. /*
  77. modification history
  78. --------------------
  79. 01h,09dec94,rhp  fix man pages for inverse trig fns
  80. 01g,05feb93,jdi  doc changes based on kdl review.
  81. 01f,02dec92,jdi  doc tweaks.
  82. 01e,28oct92,jdi  documentation cleanup.
  83. 01d,13oct92,jdi  mangen fixes.
  84. 01c,21sep92,smb  corrected file name in first line of file.
  85. 01b,20sep92,smb  documentation additions
  86. 01a,08jul92,smb  documentation
  87. */
  88. /*
  89. DESCRIPTION
  90.  * Copyright (c) 1985 Regents of the University of California.
  91.  * All rights reserved.
  92.  *
  93.  * Redistribution and use in source and binary forms are permitted
  94.  * provided that the above copyright notice and this paragraph are
  95.  * duplicated in all such forms and that any documentation,
  96.  * advertising materials, and other materials related to such
  97.  * distribution and use acknowledge that the software was developed
  98.  * by the University of California, Berkeley.  The name of the
  99.  * University may not be used to endorse or promote products derived
  100.  * from this software without specific prior written permission.
  101.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  102.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  103.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  104.  *
  105.  * All recipients should regard themselves as participants in an ongoing
  106.  * research project and hence should feel obligated to report their
  107.  * experiences (good or bad) with these elementary function codes, using
  108.  * the sendbug(8) program, to the authors.
  109. SEE ALSO: American National Standard X3.159-1989
  110. NOMANUAL
  111. */
  112. #include "vxWorks.h"
  113. #include "math.h"
  114. /*******************************************************************************
  115. *
  116. * asin - compute an arc sine (ANSI)
  117. *
  118. * This routine returns the principal value of the arc sine of <x>
  119. * in double precision (IEEE double, 53 bits).
  120. * If <x> is the sine of an angle <T>, this function returns <T>.
  121. *
  122. * A domain error occurs for arguments not in the range [-1,+1].
  123. *
  124. * INTERNAL
  125. * Method:
  126. *     asin(x) = atan2(x,sqrt(1-x*x))
  127. * For better accuracy, 1-x*x is computed as follows:
  128. *     1-x*x                     if x <  0.5,
  129. *     2*(1-|x|)-(1-|x|)*(1-|x|) if x >= 0.5.
  130. *
  131. * INCLUDE FILES: math.h
  132. *
  133. * RETURNS:
  134. * The double-precision arc sine of <x> in the range [-pi/2,pi/2] radians.
  135. *
  136. * Special cases:
  137. *     If <x> is NaN, asin() returns <x>.
  138. *     If |x|>1, it returns NaN.
  139. *
  140. * SEE ALSO: mathALib
  141. *
  142. * INTERNAL
  143. * Coded in C by K.C. Ng, 4/16/85, REVISED ON 6/10/85.
  144. */
  145. double asin
  146.     (
  147.     double x /* number between -1 and 1 */
  148.     )
  149.     {
  150. double s,t,copysign(),atan2(),sqrt(),one=1.0;
  151. #if !defined(vax)&&!defined(tahoe)
  152. if(x!=x) return(x); /* x is NaN */
  153. #endif /* !defined(vax)&&!defined(tahoe) */
  154. s=copysign(x,one);
  155. if(s <= 0.5)
  156.     return(atan2(x,sqrt(one-x*x)));
  157. else
  158.     { t=one-s; s=t+t; return(atan2(x,sqrt(s-t*t))); }
  159.     }
  160. /*******************************************************************************
  161. *
  162. * acos - compute an arc cosine (ANSI)
  163. *
  164. * This routine returns principal value of the arc cosine of <x>
  165. * in double precision (IEEE double, 53 bits).
  166. * If <x> is the cosine of an angle <T>, this function returns <T>.
  167. *
  168. * A domain error occurs for arguments not in the range [-1,+1].
  169. *
  170. * INTERNAL
  171. * Method:
  172. *       ________
  173. *                           / 1 - x
  174. * acos(x) = 2*atan2( / -------- , 1 ) .
  175. *                        /   1 + x
  176. *
  177. * INCLUDE FILES: math.h
  178. *
  179. * RETURNS:
  180. * The double-precision arc cosine of <x> in the range [0,pi] radians.
  181. *
  182. * Special cases:
  183. *     If <x> is NaN, acos() returns <x>.
  184. *     If |x|>1, it returns NaN.
  185. *
  186. * SEE ALSO: mathALib
  187. *
  188. * INTERNAL
  189. * Coded in C by K.C. Ng, 4/16/85, revised on 6/10/85.
  190. */
  191. double acos
  192.     (
  193.     double x /* number between -1 and 1 */
  194.     )
  195.     {
  196. double t,copysign(),atan2(),sqrt(),one=1.0;
  197. #if !defined(vax)&&!defined(tahoe)
  198. if(x!=x) return(x);
  199. #endif /* !defined(vax)&&!defined(tahoe) */
  200. if( x != -1.0)
  201.     t=atan2(sqrt((one-x)/(one+x)),one);
  202. else
  203.     t=atan2(one,0.0); /* t = PI/2 */
  204. return(t+t);
  205.     }
  206. /* atan.c - math routines */
  207. /* Copyright 1992-1994 Wind River Systems, Inc. */
  208. /*
  209. modification history
  210. --------------------
  211. 01d,09dec94,rhp  fix man pages for inverse trig fns
  212. 01e,05feb93,jdi  doc changes based on kdl review.
  213. 01d,02dec92,jdi  doc tweaks.
  214. 01c,28oct92,jdi  documentation cleanup.
  215. 01b,20sep92,smb  documentation additions
  216. 01a,08jul92,smb  documentation.
  217. */
  218. /*
  219. DESCRIPTION
  220. * Copyright (c) 1985 Regents of the University of California.
  221. * All rights reserved.
  222. *
  223. * Redistribution and use in source and binary forms are permitted
  224. * provided that the above copyright notice and this paragraph are
  225. * duplicated in all such forms and that any documentation,
  226. * advertising materials, and other materials related to such
  227. * distribution and use acknowledge that the software was developed
  228. * by the University of California, Berkeley.  The name of the
  229. * University may not be used to endorse or promote products derived
  230. * from this software without specific prior written permission.
  231. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  232. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  233. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  234. *
  235. * All recipients should regard themselves as participants in an ongoing
  236. * research project and hence should feel obligated to report their
  237. * experiences (good or bad) with these elementary function codes, using
  238. * the sendbug(8) program, to the authors.
  239. SEE ALSO: American National Standard X3.159-1989
  240. NOMANUAL
  241. */
  242. #include "vxWorks.h"
  243. #include "math.h"
  244. /*******************************************************************************
  245. *
  246. * atan - compute an arc tangent (ANSI)
  247. *
  248. * This routine returns the principal value of the arc tangent of <x> in
  249. * double precision (IEEE double, 53 bits).
  250. * If <x> is the tangent of an angle <T>, this function returns <T> 
  251. * (in radians).
  252. *
  253. * INCLUDE FILES: math.h
  254. *
  255. * RETURNS:
  256. * The double-precision arc tangent of <x> in the range [-pi/2,pi/2] radians.
  257. * Special case: if <x> is NaN, atan() returns <x> itself.
  258. *
  259. * SEE ALSO: mathALib
  260. *
  261. * INTERNAL:
  262. * Coded in C by K.C. Ng, 4/16/85, revised on 6/10/85.
  263. */
  264. double atan
  265.     (
  266.     double x /* tangent of an angle */
  267.     )
  268.     {
  269. double atan2(),one=1.0;
  270. return(atan2(x,one));
  271.     }
  272. /* atan2.c - math routines */
  273. /* Copyright 1992-1993 Wind River Systems, Inc. */
  274. /*
  275. modification history
  276. --------------------
  277. 01e,05feb93,jdi  doc changes based on kdl review.
  278. 01d,02dec92,jdi  doc tweaks.
  279. 01c,28oct92,jdi  documentation cleanup.
  280. 01b,20sep92,smb  documentation additions
  281. 01a,08jul92,smb  documentation.
  282. */
  283. /*
  284. DESCRIPTION
  285. * Copyright (c) 1985 Regents of the University of California.
  286. * All rights reserved.
  287. *
  288. * Redistribution and use in source and binary forms are permitted
  289. * provided that the above copyright notice and this paragraph are
  290. * duplicated in all such forms and that any documentation,
  291. * advertising materials, and other materials related to such
  292. * distribution and use acknowledge that the software was developed
  293. * by the University of California, Berkeley.  The name of the
  294. * University may not be used to endorse or promote products derived
  295. * from this software without specific prior written permission.
  296. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  297. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  298. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  299. *
  300. * All recipients should regard themselves as participants in an ongoing
  301. * research project and hence should feel obligated to report their
  302. * experiences (good or bad) with these elementary function codes, using
  303. * the sendbug(8) program, to the authors.
  304. *
  305. SEE ALSO: American National Standard X3.159-1989
  306. NOMANUAL
  307. */
  308. #include "vxWorks.h"
  309. #include "math.h"
  310. #if defined(vax)||defined(tahoe)  /* VAX D format */
  311. #ifdef vax
  312. #define _0x(A,B) 0x/**/A/**/B
  313. #else /* vax */
  314. #define _0x(A,B) 0x/**/B/**/A
  315. #endif /* vax */
  316. /*static double */
  317. /*athfhi =  4.6364760900080611433E-1  ,*//*Hex  2^ -1   *  .ED63382B0DDA7B */
  318. /*athflo =  1.9338828231967579916E-19 ,*//*Hex  2^-62   *  .E450059CFE92C0 */
  319. /*PIo4   =  7.8539816339744830676E-1  ,*//*Hex  2^  0   *  .C90FDAA22168C2 */
  320. /*at1fhi =  9.8279372324732906796E-1  ,*//*Hex  2^  0   *  .FB985E940FB4D9 */
  321. /*at1flo = -3.5540295636764633916E-18 ,*//*Hex  2^-57   * -.831EDC34D6EAEA */
  322. /*PIo2   =  1.5707963267948966135E0   ,*//*Hex  2^  1   *  .C90FDAA22168C2 */
  323. /*PI     =  3.1415926535897932270E0   ,*//*Hex  2^  2   *  .C90FDAA22168C2 */
  324. /*a1     =  3.3333333333333473730E-1  ,*//*Hex  2^ -1   *  .AAAAAAAAAAAB75 */
  325. /*a2     = -2.0000000000017730678E-1  ,*//*Hex  2^ -2   * -.CCCCCCCCCD946E */
  326. /*a3     =  1.4285714286694640301E-1  ,*//*Hex  2^ -2   *  .92492492744262 */
  327. /*a4     = -1.1111111135032672795E-1  ,*//*Hex  2^ -3   * -.E38E38EBC66292 */
  328. /*a5     =  9.0909091380563043783E-2  ,*//*Hex  2^ -3   *  .BA2E8BB31BD70C */
  329. /*a6     = -7.6922954286089459397E-2  ,*//*Hex  2^ -3   * -.9D89C827C37F18 */
  330. /*a7     =  6.6663180891693915586E-2  ,*//*Hex  2^ -3   *  .8886B4AE379E58 */
  331. /*a8     = -5.8772703698290408927E-2  ,*//*Hex  2^ -4   * -.F0BBA58481A942 */
  332. /*a9     =  5.2170707402812969804E-2  ,*//*Hex  2^ -4   *  .D5B0F3A1AB13AB */
  333. /*a10    = -4.4895863157820361210E-2  ,*//*Hex  2^ -4   * -.B7E4B97FD1048F */
  334. /*a11    =  3.3006147437343875094E-2  ,*//*Hex  2^ -4   *  .8731743CF72D87 */
  335. /*a12    = -1.4614844866464185439E-2  ;*//*Hex  2^ -6   * -.EF731A2F3476D9 */
  336. static long athfhix[] = { _0x(6338,3fed), _0x(da7b,2b0d)};
  337. #define athfhi (*(double *)athfhix)
  338. static long athflox[] = { _0x(5005,2164), _0x(92c0,9cfe)};
  339. #define athflo (*(double *)athflox)
  340. static long   PIo4x[] = { _0x(0fda,4049), _0x(68c2,a221)};
  341. #define   PIo4 (*(double *)PIo4x)
  342. static long at1fhix[] = { _0x(985e,407b), _0x(b4d9,940f)};
  343. #define at1fhi (*(double *)at1fhix)
  344. static long at1flox[] = { _0x(1edc,a383), _0x(eaea,34d6)};
  345. #define at1flo (*(double *)at1flox)
  346. static long   PIo2x[] = { _0x(0fda,40c9), _0x(68c2,a221)};
  347. #define   PIo2 (*(double *)PIo2x)
  348. static long     PIx[] = { _0x(0fda,4149), _0x(68c2,a221)};
  349. #define     PI (*(double *)PIx)
  350. static long     a1x[] = { _0x(aaaa,3faa), _0x(ab75,aaaa)};
  351. #define     a1 (*(double *)a1x)
  352. static long     a2x[] = { _0x(cccc,bf4c), _0x(946e,cccd)};
  353. #define     a2 (*(double *)a2x)
  354. static long     a3x[] = { _0x(4924,3f12), _0x(4262,9274)};
  355. #define     a3 (*(double *)a3x)
  356. static long     a4x[] = { _0x(8e38,bee3), _0x(6292,ebc6)};
  357. #define     a4 (*(double *)a4x)
  358. static long     a5x[] = { _0x(2e8b,3eba), _0x(d70c,b31b)};
  359. #define     a5 (*(double *)a5x)
  360. static long     a6x[] = { _0x(89c8,be9d), _0x(7f18,27c3)};
  361. #define     a6 (*(double *)a6x)
  362. static long     a7x[] = { _0x(86b4,3e88), _0x(9e58,ae37)};
  363. #define     a7 (*(double *)a7x)
  364. static long     a8x[] = { _0x(bba5,be70), _0x(a942,8481)};
  365. #define     a8 (*(double *)a8x)
  366. static long     a9x[] = { _0x(b0f3,3e55), _0x(13ab,a1ab)};
  367. #define     a9 (*(double *)a9x)
  368. static long    a10x[] = { _0x(e4b9,be37), _0x(048f,7fd1)};
  369. #define    a10 (*(double *)a10x)
  370. static long    a11x[] = { _0x(3174,3e07), _0x(2d87,3cf7)};
  371. #define    a11 (*(double *)a11x)
  372. static long    a12x[] = { _0x(731a,bd6f), _0x(76d9,2f34)};
  373. #define    a12 (*(double *)a12x)
  374. #else /* defined(vax)||defined(tahoe) */
  375. static double
  376. athfhi =  4.6364760900080609352E-1    , /*Hex  2^ -2   *  1.DAC670561BB4F */
  377. athflo =  4.6249969567426939759E-18   , /*Hex  2^-58   *  1.5543B8F253271 */
  378. PIo4   =  7.8539816339744827900E-1    , /*Hex  2^ -1   *  1.921FB54442D18 */
  379. at1fhi =  9.8279372324732905408E-1    , /*Hex  2^ -1   *  1.F730BD281F69B */
  380. at1flo = -2.4407677060164810007E-17   , /*Hex  2^-56   * -1.C23DFEFEAE6B5 */
  381. PIo2   =  1.5707963267948965580E0     , /*Hex  2^  0   *  1.921FB54442D18 */
  382. PI     =  3.1415926535897931160E0     , /*Hex  2^  1   *  1.921FB54442D18 */
  383. a1     =  3.3333333333333942106E-1    , /*Hex  2^ -2   *  1.55555555555C3 */
  384. a2     = -1.9999999999979536924E-1    , /*Hex  2^ -3   * -1.9999999997CCD */
  385. a3     =  1.4285714278004377209E-1    , /*Hex  2^ -3   *  1.24924921EC1D7 */
  386. a4     = -1.1111110579344973814E-1    , /*Hex  2^ -4   * -1.C71C7059AF280 */
  387. a5     =  9.0908906105474668324E-2    , /*Hex  2^ -4   *  1.745CE5AA35DB2 */
  388. a6     = -7.6919217767468239799E-2    , /*Hex  2^ -4   * -1.3B0FA54BEC400 */
  389. a7     =  6.6614695906082474486E-2    , /*Hex  2^ -4   *  1.10DA924597FFF */
  390. a8     = -5.8358371008508623523E-2    , /*Hex  2^ -5   * -1.DE125FDDBD793 */
  391. a9     =  4.9850617156082015213E-2    , /*Hex  2^ -5   *  1.9860524BDD807 */
  392. a10    = -3.6700606902093604877E-2    , /*Hex  2^ -5   * -1.2CA6C04C6937A */
  393. a11    =  1.6438029044759730479E-2    ; /*Hex  2^ -6   *  1.0D52174A1BB54 */
  394. #endif /* defined(vax)||defined(tahoe) */
  395. /*******************************************************************************
  396. *
  397. * atan2 - compute the arc tangent of y/x (ANSI)
  398. *
  399. * This routine returns the principal value of the arc tangent of <y>/<x> in
  400. * double precision (IEEE double, 53 bits).
  401. * This routine uses the signs of both arguments to determine the quadrant of the
  402. * return value.  A domain error may occur if both arguments are zero.
  403. *
  404. * INTERNAL:
  405. * (1) Reduce <y> to positive by:
  406. *     atan2(y,x)=-atan2(-y,x)
  407. * (2) Reduce <x> to positive by (if <x> and <y> are unexceptional):
  408. *     ARG (x+iy) = arctan(y/x)     ... if x > 0
  409. *     ARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0
  410. *
  411. * (3) According to the integer k=4t+0.25 truncated , t=y/x, the argument
  412. *     is further reduced to one of the following intervals and the
  413. *     arc tangent of y/x is evaluated by the corresponding formula:
  414. *
  415. *     [0,7/16]       atan(y/x) = t - t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
  416. *     [7/16,11/16]    atan(y/x) = atan(1/2) + atan( (y-x/2)/(x+y/2) )
  417. *     [11/16.19/16]   atan(y/x) = atan( 1 ) + atan( (y-x)/(x+y) )
  418. *     [19/16,39/16]   atan(y/x) = atan(3/2) + atan( (y-1.5x)/(x+1.5y) )
  419. *     [39/16,INF]     atan(y/x) = atan(INF) + atan( -x/y )
  420. *
  421. * INCLUDE FILES: math.h
  422. *
  423. * RETURNS:
  424. * The double-precision arc tangent of <y>/<x>, in the range [-pi,pi] radians.
  425. *
  426. * Special cases:
  427. *     Notations: atan2(y,x) == ARG (x+iy) == ARG(x,y).
  428. * .TS
  429. * tab(|);
  430. * l0 c0 l.
  431. *     ARG(NAN, (anything))                      | is | NaN
  432. *     ARG((anything), NaN)                      | is | NaN
  433. *     ARG(+(anything but NaN), +-0)             | is | +-0
  434. *     ARG(-(anything but NaN), +-0)             | is | +-PI
  435. *     ARG(0, +-(anything but 0 and NaN))        | is | +-PI/2
  436. *     ARG(+INF, +-(anything but INF and NaN))   | is | +-0
  437. *     ARG(-INF, +-(anything but INF and NaN))   | is | +-PI
  438. *     ARG(+INF, +-INF)                          | is | +-PI/4
  439. *     ARG(-INF, +-INF)                          | is | +-3PI/4
  440. *     ARG((anything but 0, NaN, and INF),+-INF) | is | +-PI/2
  441. * .TE
  442. *
  443. * SEE ALSO: mathALib
  444. *
  445. * INTERNAL:
  446. * Coded in C by K.C. Ng, 1/8/85;
  447. * Revised by K.C. Ng on 2/7/85, 2/13/85, 3/7/85, 3/30/85, 6/29/85.
  448. */
  449. double atan2
  450.     (
  451.     double  y, /* numerator   */
  452.     double  x /* denominator */
  453.     )
  454.     {
  455. static double zero=0, one=1, small=1.0E-9, big=1.0E18;
  456. double copysign(),logb(),scalb(),t,z,signy,signx,hi,lo;
  457. int finite(), k,m;
  458. #if !defined(vax)&&!defined(tahoe)
  459.     /* if x or y is NAN */
  460. if(x!=x) return(x); if(y!=y) return(y);
  461. #endif /* !defined(vax)&&!defined(tahoe) */
  462.     /* copy down the sign of y and x */
  463. signy = copysign(one,y) ;
  464. signx = copysign(one,x) ;
  465.     /* if x is 1.0, goto begin */
  466. if(x==1) { y=copysign(y,one); t=y; if(finite(t)) goto begin;}
  467.     /* when y = 0 */
  468. if(y==zero) return((signx==one)?y:copysign(PI,signy));
  469.     /* when x = 0 */
  470. if(x==zero) return(copysign(PIo2,signy));
  471.     /* when x is INF */
  472. if(!finite(x))
  473.     if(!finite(y))
  474. return(copysign((signx==one)?PIo4:3*PIo4,signy));
  475.     else
  476. return(copysign((signx==one)?zero:PI,signy));
  477.     /* when y is INF */
  478. if(!finite(y)) return(copysign(PIo2,signy));
  479.     /* compute y/x */
  480. x=copysign(x,one);
  481. y=copysign(y,one);
  482. if((m=(k=logb(y))-logb(x)) > 60) t=big+big;
  483.     else if(m < -80 ) t=y/x;
  484.     else { t = y/x ; y = scalb(y,-k); x=scalb(x,-k); }
  485.     /* begin argument reduction */
  486. begin:
  487. if (t < 2.4375) {
  488. /* truncate 4(t+1/16) to integer for branching */
  489.     k = 4 * (t+0.0625);
  490.     switch (k) {
  491.     /* t is in [0,7/16] */
  492.     case 0:
  493.     case 1:
  494. if (t < small)
  495.     { big + small ;  /* raise inexact flag */
  496.       return (copysign((signx>zero)?t:PI-t,signy)); }
  497. hi = zero;  lo = zero;  break;
  498.     /* t is in [7/16,11/16] */
  499.     case 2:
  500. hi = athfhi; lo = athflo;
  501. z = x+x;
  502. t = ( (y+y) - x ) / ( z +  y ); break;
  503.     /* t is in [11/16,19/16] */
  504.     case 3:
  505.     case 4:
  506. hi = PIo4; lo = zero;
  507. t = ( y - x ) / ( x + y ); break;
  508.     /* t is in [19/16,39/16] */
  509.     default:
  510. hi = at1fhi; lo = at1flo;
  511. z = y-x; y=y+y+y; t = x+x;
  512. t = ( (z+z)-x ) / ( t + y ); break;
  513.     }
  514. }
  515. /* end of if (t < 2.4375) */
  516. else
  517. {
  518.     hi = PIo2; lo = zero;
  519.     /* t is in [2.4375, big] */
  520.     if (t <= big)  t = - x / y;
  521.     /* t is in [big, INF] */
  522.     else
  523.       { big+small; /* raise inexact flag */
  524. t = zero; }
  525. }
  526.     /* end of argument reduction */
  527.     /* compute atan(t) for t in [-.4375, .4375] */
  528. z = t*t;
  529. #if defined(vax)||defined(tahoe)
  530. z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
  531. z*(a9+z*(a10+z*(a11+z*a12))))))))))));
  532. #else /* defined(vax)||defined(tahoe) */
  533. z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
  534. z*(a9+z*(a10+z*a11)))))))))));
  535. #endif /* defined(vax)||defined(tahoe) */
  536. z = lo - z; z += t; z += hi;
  537. return(copysign((signx>zero)?z:PI-z,signy));
  538.     }
  539. /* ceil.c - ceil math routine */
  540. /* Copyright 1992-1993 Wind River Systems, Inc. */
  541. /*
  542. modification history
  543. --------------------
  544. 01f,05feb93,jdi  doc changes based on kdl review.
  545. 01e,02dec92,jdi  doc tweaks.
  546. 01d,28oct92,jdi  documentation cleanup.
  547. 01c,20sep92,smb  documentation additions
  548. 01b,30jul92,kdl  changed _d_type() calls to fpTypeGet().
  549. 01a,08jul92,smb  documentation.
  550. */
  551. /*
  552. DESCRIPTION
  553. SEE ALSO: American National Standard X3.159-1989
  554. NOMANUAL
  555. */
  556. #include "vxWorks.h"
  557. #include "math.h"
  558. #include "stddef.h"
  559. #include "errno.h"
  560. #include "private/mathP.h"
  561. /*******************************************************************************
  562. *
  563. * ceil - compute the smallest integer greater than or equal to a specified value (ANSI)
  564. *
  565. * This routine returns the smallest integer greater than or equal to <v>,
  566. * in double precision.
  567. *
  568. * INCLUDE FILES: math.h
  569. *
  570. * RETURNS: The smallest integral value greater than or equal to <v>, in
  571. * double precision.
  572. *
  573. * SEE ALSO: mathALib
  574. */
  575. double ceil
  576.     (
  577.     double v /* value to find the ceiling of */
  578.     )
  579.     {
  580.     double r;
  581.     switch (fpTypeGet (v, &r)) /* get the type of v */
  582.         {
  583.      case ZERO: /* ZERO */
  584.      case INF: /* INFINITY */
  585.             return (0.0);
  586.      case NAN: /* NOT A NUMBER */
  587.             return (v);
  588.      case INTEGER: /* INTEGER */
  589.             return (v);
  590.      case REAL: /* REAL */
  591.             return (((v < 0.0) || (v == r)) ? r : r + 1.0);
  592. default:
  593.     return (0.0); /* this should never happen */
  594.         }
  595.     }
  596. /* cosh.c - hyperbolic routines */
  597. /* Copyright 1992-1993 Wind River Systems, Inc. */
  598. /*
  599. modification history
  600. --------------------
  601. 01e,05feb93,jdi  doc changes based on kdl review.
  602. 01d,02dec92,jdi  doc tweaks.
  603. 01c,28oct92,jdi  documentation cleanup.
  604. 01b,20sep92,smb  documentation additions
  605. 01a,08jul92,smb  documentation
  606. */
  607. /*
  608. DESCRIPTION
  609. * Copyright (c) 1985 Regents of the University of California.
  610. * All rights reserved.
  611. *
  612. * Redistribution and use in source and binary forms are permitted
  613. * provided that the above copyright notice and this paragraph are
  614. * duplicated in all such forms and that any documentation,
  615. * advertising materials, and other materials related to such
  616. * distribution and use acknowledge that the software was developed
  617. * by the University of California, Berkeley.  The name of the
  618. * University may not be used to endorse or promote products derived
  619. * from this software without specific prior written permission.
  620. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  621. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  622. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  623. *
  624. * All recipients should regard themselves as participants in an ongoing
  625. * research project and hence should feel obligated to report their
  626. * experiences (good or bad) with these elementary function codes, using
  627. * the sendbug(8) program, to the authors.
  628. *
  629. SEE ALSO: American National Standard X3.159-1989
  630. NOMANUAL
  631. */
  632. #include "vxWorks.h"
  633. #include "math.h"
  634. #if defined(vax)||defined(tahoe)
  635. #ifdef vax
  636. #define _0x(A,B) 0x/**/A/**/B
  637. #else /* vax */
  638. #define _0x(A,B) 0x/**/B/**/A
  639. #endif /* vax */
  640. /* static double  */
  641. /* mln2hi =  8.8029691931113054792E1     , Hex  2^  7   *  .B00F33C7E22BDB */
  642. /* mln2lo = -4.9650192275318476525E-16   , Hex  2^-50   * -.8F1B60279E582A */
  643. /* lnovfl =  8.8029691931113053016E1     ; Hex  2^  7   *  .B00F33C7E22BDA */
  644. static long    mln2hix[] = { _0x(0f33,43b0), _0x(2bdb,c7e2)};
  645. static long    mln2lox[] = { _0x(1b60,a70f), _0x(582a,279e)};
  646. static long    lnovflx[] = { _0x(0f33,43b0), _0x(2bda,c7e2)};
  647. #define   mln2hi    (*(double*)mln2hix)
  648. #define   mln2lo    (*(double*)mln2lox)
  649. #define   lnovfl    (*(double*)lnovflx)
  650. #else /* defined(vax)||defined(tahoe) */
  651. static double
  652. mln2hi =  7.0978271289338397310E2     , /*Hex  2^ 10   *  1.62E42FEFA39EF */
  653. mln2lo =  2.3747039373786107478E-14   , /*Hex  2^-45   *  1.ABC9E3B39803F */
  654. lnovfl =  7.0978271289338397310E2     ; /*Hex  2^  9   *  1.62E42FEFA39EF */
  655. #endif /* defined(vax)||defined(tahoe) */
  656. #if defined(vax)||defined(tahoe)
  657. static max = 126                      ;
  658. #else /* defined(vax)||defined(tahoe) */
  659. static max = 1023                     ;
  660. #endif /* defined(vax)||defined(tahoe) */
  661. /*******************************************************************************
  662. *
  663. * cosh - compute a hyperbolic cosine (ANSI)
  664. *
  665. * This routine returns the hyperbolic cosine of <x> in
  666. * double precision (IEEE double, 53 bits).
  667. *
  668. * A range error occurs if <x> is too large.
  669. *
  670. * INTERNAL:
  671. * Method:
  672. * (1) Replace <x> by |x|.
  673. * (2)
  674. *                                                 [ exp(x) - 1 ]^2
  675. *     0        <= x <= 0.3465  :  cosh(x) := 1 + -------------------
  676. *                                                    2*exp(x)
  677. *
  678. *                                            exp(x) +  1/exp(x)
  679. *     0.3465   <= x <= 22      :  cosh(x) := -------------------
  680. *                                                    2
  681. *     22       <= x <= lnovfl  :  cosh(x) := exp(x)/2
  682. *     lnovfl   <= x <= lnovfl+log(2)
  683. *                              :  cosh(x) := exp(x)/2 (avoid overflow)
  684. *     log(2)+lnovfl <  x <  INF:  overflow to INF
  685. *
  686. *         Note: .3465 is a number near one half of ln2.
  687. *
  688. * INCLUDE FILES: math.h
  689. *
  690. * RETURNS:
  691. * The double-precision hyperbolic cosine of <x>.
  692. *
  693. * Special cases:
  694. *     If <x> is +INF, -INF, or NaN, cosh() returns <x>.
  695. *
  696. * SEE ALSO: mathALib
  697. *
  698. * INTERNAL:
  699. * Coded in C by K.C. Ng, 1/8/85;
  700. * Revised by K.C. Ng on 2/8/85, 2/23/85, 3/7/85, 3/29/85, 4/16/85.
  701. */
  702. double cosh
  703.     (
  704.     double x /* value to compute the hyperbolic cosine of */
  705.     )
  706.     {
  707. static double half=1.0/2.0,one=1.0, small=1.0E-18; /* fl(1+small)==1 */
  708. double scalb(),copysign(),exp(),exp__E(),t;
  709. #if !defined(vax)&&!defined(tahoe)
  710. if(x!=x) return(x); /* x is NaN */
  711. #endif /* !defined(vax)&&!defined(tahoe) */
  712. if((x=copysign(x,one)) <= 22)
  713.     if(x<0.3465)
  714. if(x<small) return(one+x);
  715. else {t=x+exp__E(x,0.0);x=t+t; return(one+t*t/(2.0+x)); }
  716.     else /* for x lies in [0.3465,22] */
  717.         { t=exp(x); return((t+one/t)*half); }
  718. if( lnovfl <= x && x <= (lnovfl+0.7))
  719.         /* for x lies in [lnovfl, lnovfl+ln2], decrease x by ln(2^(max+1))
  720.          * and return 2^max*exp(x) to avoid unnecessary overflow
  721.          */
  722.     return(scalb(exp((x-mln2hi)-mln2lo), max));
  723. else
  724.     return(exp(x)*half); /* for large x,  cosh(x)=exp(x)/2 */
  725.     }
  726. /* exp.c - math routines */
  727. /* Copyright 1992-1993 Wind River Systems, Inc. */
  728. /*
  729. modification history
  730. --------------------
  731. 01e,05feb93,jdi  doc changes based on kdl review.
  732. 01d,02dec92,jdi  doc tweaks.
  733. 01c,28oct92,jdi  documentation cleanup.
  734. 01b,20sep92,smb  documentation additions
  735. 01a,08jul92,smb  documentation.
  736. */
  737. /*
  738. DESCRIPTION
  739. * Copyright (c) 1985 Regents of the University of California.
  740. * All rights reserved.
  741. *
  742. * Redistribution and use in source and binary forms are permitted
  743. * provided that the above copyright notice and this paragraph are
  744. * duplicated in all such forms and that any documentation,
  745. * advertising materials, and other materials related to such
  746. * distribution and use acknowledge that the software was developed
  747. * by the University of California, Berkeley.  The name of the
  748. * University may not be used to endorse or promote products derived
  749. * from this software without specific prior written permission.
  750. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  751. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  752. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  753. *
  754. * All recipients should regard themselves as participants in an ongoing
  755. * research project and hence should feel obligated to report their
  756. * experiences (good or bad) with these elementary function codes, using
  757. * the sendbug(8) program, to the authors.
  758. *
  759. SEE ALSO: American National Standard X3.159-1989
  760. NOMANUAL
  761. */
  762. #include "vxWorks.h"
  763. #include "math.h"
  764. #if defined(vax)||defined(tahoe) /* VAX D format */
  765. #ifdef vax
  766. #define _0x(A,B) 0x/**/A/**/B
  767. #else /* vax */
  768. #define _0x(A,B) 0x/**/B/**/A
  769. #endif /* vax */
  770. /* static double */
  771. /* ln2hi  =  6.9314718055829871446E-1    , Hex  2^  0   *  .B17217F7D00000 */
  772. /* ln2lo  =  1.6465949582897081279E-12   , Hex  2^-39   *  .E7BCD5E4F1D9CC */
  773. /* lnhuge =  9.4961163736712506989E1     , Hex  2^  7   *  .BDEC1DA73E9010 */
  774. /* lntiny = -9.5654310917272452386E1     , Hex  2^  7   * -.BF4F01D72E33AF */
  775. /* invln2 =  1.4426950408889634148E0     ; Hex  2^  1   *  .B8AA3B295C17F1 */
  776. /* p1     =  1.6666666666666602251E-1    , Hex  2^-2    *  .AAAAAAAAAAA9F1 */
  777. /* p2     = -2.7777777777015591216E-3    , Hex  2^-8    * -.B60B60B5F5EC94 */
  778. /* p3     =  6.6137563214379341918E-5    , Hex  2^-13   *  .8AB355792EF15F */
  779. /* p4     = -1.6533902205465250480E-6    , Hex  2^-19   * -.DDEA0E2E935F84 */
  780. /* p5     =  4.1381367970572387085E-8    , Hex  2^-24   *  .B1BB4B95F52683 */
  781. static long     ln2hix[] = { _0x(7217,4031), _0x(0000,f7d0)};
  782. static long     ln2lox[] = { _0x(bcd5,2ce7), _0x(d9cc,e4f1)};
  783. static long    lnhugex[] = { _0x(ec1d,43bd), _0x(9010,a73e)};
  784. static long    lntinyx[] = { _0x(4f01,c3bf), _0x(33af,d72e)};
  785. static long    invln2x[] = { _0x(aa3b,40b8), _0x(17f1,295c)};
  786. static long        p1x[] = { _0x(aaaa,3f2a), _0x(a9f1,aaaa)};
  787. static long        p2x[] = { _0x(0b60,bc36), _0x(ec94,b5f5)};
  788. static long        p3x[] = { _0x(b355,398a), _0x(f15f,792e)};
  789. static long        p4x[] = { _0x(ea0e,b6dd), _0x(5f84,2e93)};
  790. static long        p5x[] = { _0x(bb4b,3431), _0x(2683,95f5)};
  791. #define    ln2hi    (*(double*)ln2hix)
  792. #define    ln2lo    (*(double*)ln2lox)
  793. #define   lnhuge    (*(double*)lnhugex)
  794. #define   lntiny    (*(double*)lntinyx)
  795. #define   invln2    (*(double*)invln2x)
  796. #define       p1    (*(double*)p1x)
  797. #define       p2    (*(double*)p2x)
  798. #define       p3    (*(double*)p3x)
  799. #define       p4    (*(double*)p4x)
  800. #define       p5    (*(double*)p5x)
  801. #else /* defined(vax)||defined(tahoe) */
  802. static double
  803. p1     =  1.6666666666666601904E-1    , /*Hex  2^-3    *  1.555555555553E */
  804. p2     = -2.7777777777015593384E-3    , /*Hex  2^-9    * -1.6C16C16BEBD93 */
  805. p3     =  6.6137563214379343612E-5    , /*Hex  2^-14   *  1.1566AAF25DE2C */
  806. p4     = -1.6533902205465251539E-6    , /*Hex  2^-20   * -1.BBD41C5D26BF1 */
  807. p5     =  4.1381367970572384604E-8    , /*Hex  2^-25   *  1.6376972BEA4D0 */
  808. ln2hi  =  6.9314718036912381649E-1    , /*Hex  2^ -1   *  1.62E42FEE00000 */
  809. ln2lo  =  1.9082149292705877000E-10   , /*Hex  2^-33   *  1.A39EF35793C76 */
  810. lnhuge =  7.1602103751842355450E2     , /*Hex  2^  9   *  1.6602B15B7ECF2 */
  811. lntiny = -7.5137154372698068983E2     , /*Hex  2^  9   * -1.77AF8EBEAE354 */
  812. invln2 =  1.4426950408889633870E0     ; /*Hex  2^  0   *  1.71547652B82FE */
  813. #endif /* defined(vax)||defined(tahoe) */
  814. /*****************************************************************************
  815. *
  816. * exp - compute an exponential value (ANSI)
  817. *
  818. * This routine returns the exponential value of <x> in
  819. * double precision (IEEE double, 53 bits).
  820. *
  821. * A range error occurs if <x> is too large.
  822. *
  823. * INTERNAL:
  824. * Method:
  825. * (1) Argument Reduction: given the input <x>, find <r> and integer <k>
  826. *     such that:
  827. *
  828. *         x = k*ln2 + r,  |r| <= 0.5*ln2
  829. *     <r> will be represented as r := z+c for better accuracy.
  830. * (2) Compute exp(r) by
  831. *
  832. *         exp(r) = 1 + r + r*R1/(2-R1)
  833. *
  834. *     where:
  835. *
  836. *         R1 = x - x^2*(p1+x^2*(p2+x^2*(p3+x^2*(p4+p5*x^2))))
  837. *
  838. * (3)     exp(x) = 2^k * exp(r)
  839. *
  840. * INCLUDE FILES: math.h
  841. *
  842. * RETURNS: The double-precision exponential value of <x>.
  843. *
  844. * Special cases:
  845. *     If <x> is +INF or NaN, exp() returns <x>.
  846. *     If <x> is -INF, it returns 0.
  847. *
  848. * SEE ALSO: mathALib
  849. *
  850. * INTERNAL:
  851. * Coded in C by K.C. Ng, 1/19/85;
  852. * Revised by K.C. Ng on 2/6/85, 2/15/85, 3/7/85, 3/24/85, 4/16/85, 6/14/86.
  853. */
  854. double exp
  855.     (
  856.     double x /* exponent */
  857.     )
  858.     {
  859. double scalb(), copysign(), z,hi,lo,c;
  860. int k,finite();
  861. #if !defined(vax)&&!defined(tahoe)
  862. if(x!=x) return(x); /* x is NaN */
  863. #endif /* !defined(vax)&&!defined(tahoe) */
  864. if( x <= lnhuge ) {
  865. if( x >= lntiny ) {
  866.     /* argument reduction : x --> x - k*ln2 */
  867. k=invln2*x+copysign(0.5,x); /* k=NINT(x/ln2) */
  868.     /* express x-k*ln2 as hi-lo and let x=hi-lo rounded */
  869. hi=x-k*ln2hi;
  870. x=hi-(lo=k*ln2lo);
  871.     /* return 2^k*[1+x+x*c/(2+c)]  */
  872. z=x*x;
  873. c= x - z*(p1+z*(p2+z*(p3+z*(p4+z*p5))));
  874. return  scalb(1.0+(hi-(lo-(x*c)/(2.0-c))),k);
  875. }
  876. /* end of x > lntiny */
  877. else
  878.      /* exp(-big#) underflows to zero */
  879.      if(finite(x))  return(scalb(1.0,-5000));
  880.      /* exp(-INF) is zero */
  881.      else return(0.0);
  882. }
  883. /* end of x < lnhuge */
  884. else
  885. /* exp(INF) is INF, exp(+big#) overflows to INF */
  886.     return( finite(x) ?  scalb(1.0,5000)  : x);
  887.     }
  888. /* fabs.c - fabs math routine */
  889. /* Copyright 1992-1993 Wind River Systems, Inc. */
  890. /*
  891. modification history
  892. --------------------
  893. 01f,05feb93,jdi  doc changes based on kdl review.
  894. 01e,02dec92,jdi  doc tweaks.
  895. 01d,28oct92,jdi  documentation cleanup.
  896. 01c,20sep92,smb  documentation additions
  897. 01b,30jul92,kdl  changed _d_type() calls to fpTypeGet().
  898. 01a,08jul92,smb  documentation.
  899. */
  900. /*
  901. DESCRIPTION
  902. SEE ALSO: American National Standard X3.159-1989
  903. NOMANUAL
  904. */
  905. #include "vxWorks.h"
  906. #include "math.h"
  907. #include "stddef.h"
  908. #include "errno.h"
  909. #include "private/mathP.h"
  910. /*******************************************************************************
  911. *
  912. * fabs - compute an absolute value (ANSI)
  913. *
  914. * This routine returns the absolute value of <v> in double precision.
  915. *
  916. * INCLUDE FILES: math.h
  917. *
  918. * RETURNS: The double-precision absolute value of <v>.
  919. *
  920. * ERRNO: EDOM, ERANGE
  921. *
  922. * SEE ALSO: mathALib
  923. */
  924. double fabs
  925.     (
  926.     double v /* number to return the absolute value of */
  927.     )
  928.     {
  929.     switch (fpTypeGet (v, NULL))
  930. {
  931. case ZERO: /* ZERO */
  932.     return (0.0);
  933. case NAN: /* NOT  A NUMBER */
  934.     errno = EDOM;
  935.     return (v);
  936. case INF: /* INFINITE */
  937.     errno = ERANGE;
  938. case INTEGER: /* INTEGER */
  939. case REAL: /* REAL */
  940.     return ((v < 0.0) ? - v : v);
  941. default:
  942.     return (0.0);
  943. }
  944.     }
  945. /* floor.c - floor math routine */
  946. /* Copyright 1992-1993 Wind River Systems, Inc. */
  947. /*
  948. modification history
  949. --------------------
  950. 01f,05feb93,jdi  doc changes based on kdl review.
  951. 01e,02dec92,jdi  doc tweaks.
  952. 01d,28oct92,jdi  documentation cleanup.
  953. 01c,20sep92,smb  documentation additions
  954. 01b,30jul92,kdl  changed _d_type() calls to fpTypeGet().
  955. 01a,08jul92,smb  documentation.
  956. */
  957. /*
  958. DESCRIPTION
  959. SEE ALSO: American National Standard X3.159-1989
  960. NOMANUAL
  961. */
  962. #include "vxWorks.h"
  963. #include "math.h"
  964. #include "stddef.h"
  965. #include "errno.h"
  966. #include "private/mathP.h"
  967. /*******************************************************************************
  968. *
  969. * floor - compute the largest integer less than or equal to a specified value (ANSI)
  970. *
  971. * This routine returns the largest integer less than or equal to <v>, in
  972. * double precision.
  973. * INCLUDE FILES: math.h
  974. *
  975. * RETURNS:
  976. * The largest integral value less than or equal to <v>, in double precision.
  977. *
  978. * SEE ALSO: mathALib
  979. */
  980. double floor
  981.     (
  982.     double v /* value to find the floor of */
  983.     )
  984.     {
  985.     double r;
  986.     switch (fpTypeGet (v, &r)) /* find out the type of v */
  987. {
  988. case ZERO:
  989. case INF: return (0);
  990. case NAN: return (v);
  991. case INTEGER: return (v);
  992. case REAL: return (((v < 0.0) && (v != r)) ? (r - 1.0) : (r));
  993. default: return (0); /* this should never happen */
  994. }
  995.     }
  996. /* fmod.c - fmod math routine */
  997. /* Copyright 1992-1993 Wind River Systems, Inc. */
  998. /*
  999. modification history
  1000. --------------------
  1001. 01f,05feb93,jdi  doc changes based on kdl review.
  1002. 01e,02dec92,jdi  doc tweaks.
  1003. 01d,28oct92,jdi  documentation cleanup.
  1004. 01c,20sep92,smb  documentation additions
  1005. 01b,30jul92,kdl  changed _d_type() calls to fpTypeGet().
  1006. 01a,08jul92,smb  documentation.
  1007. */
  1008. /*
  1009. DESCRIPTION
  1010. SEE ALSO: American National Standard X3.159-1989
  1011. NOMANUAL
  1012. */
  1013. #include "vxWorks.h"
  1014. #include "math.h"
  1015. #include "stddef.h"
  1016. #include "errno.h"
  1017. #include "private/mathP.h"
  1018. /*******************************************************************************
  1019. *
  1020. * fmod - compute the remainder of x/y (ANSI)
  1021. *
  1022. * This routine returns the remainder of <x>/<y> with the sign of <x>,
  1023. * in double precision.
  1024. * INCLUDE FILES: math.h
  1025. *
  1026. * RETURNS: The value <x> - <i> * <y>, for some integer <i>.  If <y> is
  1027. * non-zero, the result has the same sign as <x> and magnitude less than the
  1028. * magnitude of <y>.  If <y> is zero, fmod() returns zero.
  1029. *
  1030. * ERRNO: EDOM
  1031. *
  1032. * SEE ALSO: mathALib
  1033. */
  1034. double fmod
  1035.     (
  1036.     double x, /* numerator   */
  1037.     double y /* denominator */
  1038.     )
  1039.     {
  1040.     double t;
  1041.     short negative = 0;
  1042.     int errx = fpTypeGet (x, NULL); /* determine number type */
  1043.     int erry = fpTypeGet (y, NULL); /* determine number type */
  1044.     if (errx == NAN || erry == NAN || errx == INF || erry == ZERO)
  1045.         {
  1046.         errno = EDOM; /* Domain error */
  1047.         return ((errx == NAN) ? (x) : ((erry == NAN) ? (y) : (0)));
  1048.         }
  1049.     
  1050.     if (errx == ZERO || erry == INF)
  1051. return (x);
  1052.     /* make x and y absolute */
  1053.     if (y < 0.0)
  1054. y = -y;
  1055.     if (x < 0.0)
  1056. {
  1057. x = -x;
  1058. negative = 1;
  1059. }
  1060.     /* loop substracting y from x until a value less than y remains */
  1061.     for (t = x; t > y; t -= y)
  1062.         ;
  1063.     return ((t == y) ? (0.0) : ((negative) ? (-t) : (t)));
  1064.     }
  1065. /* frexp.c - frexp math routine */
  1066. /* Copyright 1992-1996 Wind River Systems, Inc. */
  1067. /*
  1068. modification history
  1069. --------------------
  1070. 01h,05aug96,dbt  frexp now returned a value >= 0.5 and strictly less than 1.0.
  1071.  (SPR #4280).
  1072.  Updated copyright.
  1073. 01g,05feb93,jdi  doc changes based on kdl review.
  1074. 01f,02dec92,jdi  doc tweaks.
  1075. 01e,28oct92,jdi  documentation cleanup.
  1076. 01d,21sep92,smb  replaced orignal versions.
  1077. 01c,20sep92,smb  documentation additions
  1078. 01b,30jul92,kdl  replaced routine contents with frexp() from floatLib.c.
  1079. 01a,08jul92,smb  written, documentation.
  1080. */
  1081. /*
  1082. DESCRIPTION
  1083. SEE ALSO: American National Standard X3.159-1989
  1084. NOMANUAL
  1085. */
  1086. #include "math.h"
  1087. #include "stddef.h"
  1088. #include "errno.h"
  1089. #include "private/mathP.h"
  1090. /*******************************************************************************
  1091. *
  1092. * frexp - break a floating-point number into a normalized fraction and power of 2 (ANSI)
  1093. *
  1094. * This routine breaks a double-precision number <value> into a normalized
  1095. * fraction and integral power of 2.  It stores the integer exponent in <pexp>.
  1096. *
  1097. * INCLUDE FILES: math.h
  1098. *
  1099. * RETURNS: 
  1100. * The double-precision value <x>, such that the magnitude of <x> is
  1101. * in the interval [1/2,1) or zero, and <value> equals <x> times
  1102. * 2 to the power of <pexp>. If <value> is zero, both parts of the result
  1103. * are zero.
  1104. *
  1105. * ERRNO: EDOM
  1106. *
  1107. */
  1108. double frexp
  1109.     (
  1110.     double value, /* number to be normalized */
  1111.     int *pexp    /* pointer to the exponent */
  1112.     )
  1113.     {
  1114.     double r;
  1115.     *pexp = 0;
  1116.     /* determine number type */
  1117.     switch (fpTypeGet(value, &r))
  1118.        {
  1119.         case NAN: /* NOT A NUMBER */
  1120.      case INF: /* INFINITE */
  1121.             errno = EDOM;
  1122.     return (value);
  1123.      case ZERO: /* ZERO */
  1124.     return (0.0);
  1125. default:
  1126.     /*
  1127.      * return value must be strictly less than 1.0 and >=0.5 .
  1128.      */
  1129.     if ((r = fabs(value)) >= 1.0)
  1130.         for(; (r >= 1.0); (*pexp)++, r /= 2.0);
  1131.     else
  1132.         for(; (r < 0.5); (*pexp)--, r *= 2.0);
  1133.     return (value < 0 ? -r : r);
  1134.         }
  1135.     }
  1136. /* ldexp.c - ldexp math routine */
  1137. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1138. /*
  1139. modification history
  1140. --------------------
  1141. 01g,05feb93,jdi  doc changes based on kdl review.
  1142. 01f,02dec92,jdi  doc tweaks.
  1143. 01e,28oct92,jdi  documentation cleanup.
  1144. 01d,21sep92,smb  replaced original version.
  1145. 01c,20sep92,smb  documentation additions
  1146. 01b,30jul92,kdl  replaced routine contents with ldexp() from floatLib.c.
  1147. 01a,08jul92,smb  written, documentation.
  1148. */
  1149. /*
  1150. DESCRIPTION
  1151. SEE ALSO: American National Standard X3.159-1989
  1152. NOMANUAL
  1153. */
  1154. #include "math.h"
  1155. #include "stddef.h"
  1156. #include "errno.h"
  1157. #include "private/mathP.h"
  1158. /*******************************************************************************
  1159. *
  1160. * ldexp - multiply a number by an integral power of 2 (ANSI)
  1161. *
  1162. * This routine multiplies a floating-point number by an integral power of 2.
  1163. * A range error may occur.
  1164. *
  1165. * INCLUDE FILES: math.h
  1166. *
  1167. * RETURNS: The double-precision value of <v> times 2 to the power of <xexp>.
  1168. *
  1169. */
  1170. double ldexp
  1171.     (
  1172.     double v, /* a floating point number */
  1173.     int xexp /* exponent                */
  1174.     )
  1175.     {
  1176.     double zero = 0.0;
  1177.     switch (fpTypeGet (v, NULL))
  1178.         {
  1179.         case NAN: /* NOT A NUMBER */
  1180.             errno = EDOM;
  1181.     break;
  1182.      case INF: /* INFINITE */
  1183.     errno = ERANGE;
  1184.     break;
  1185.      case ZERO: /* ZERO */
  1186.     return (zero);
  1187. default:
  1188.     if (xexp >= 0)
  1189. for(; (xexp > 0); xexp--, v *= 2.0);
  1190.     else
  1191. for(; (xexp < 0); xexp++, v /= 2.0);
  1192.     return (v);
  1193.      }
  1194.     return (zero);
  1195.     }
  1196. /* log.c - math routines */
  1197. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1198. /*
  1199. modification history
  1200. --------------------
  1201. 01f,05feb93,jdi  doc changes based on kdl review.
  1202. 01e,02dec92,jdi  doc tweaks.
  1203. 01d,28oct92,jdi  documentation cleanup.
  1204. 01c,13oct92,jdi  mangen fixes.
  1205. 01b,20sep92,smb  documentation additions
  1206. 01a,08jul92,smb  documentation
  1207. */
  1208. /*
  1209. DESCRIPTION
  1210. * Copyright (c) 1985 Regents of the University of California.
  1211. * All rights reserved.
  1212. *
  1213. * Redistribution and use in source and binary forms are permitted
  1214. * provided that the above copyright notice and this paragraph are
  1215. * duplicated in all such forms and that any documentation,
  1216. * advertising materials, and other materials related to such
  1217. * distribution and use acknowledge that the software was developed
  1218. * by the University of California, Berkeley.  The name of the
  1219. * University may not be used to endorse or promote products derived
  1220. * from this software without specific prior written permission.
  1221. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1222. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1223. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1224. *
  1225. * All recipients should regard themselves as participants in an ongoing
  1226. * research project and hence should feel obligated to report their
  1227. * experiences (good or bad) with these elementary function codes, using
  1228. * the sendbug(8) program, to the authors.
  1229. *
  1230. SEE ALSO: American National Standard X3.159-1989
  1231. NOMANUAL
  1232. */
  1233. #include "vxWorks.h"
  1234. #include "math.h"
  1235. #if defined(vax)||defined(tahoe) /* VAX D format */
  1236. #include <errno.h>
  1237. #ifdef vax
  1238. #define _0x(A,B) 0x/**/A/**/B
  1239. #else /* vax */
  1240. #define _0x(A,B) 0x/**/B/**/A
  1241. #endif /* vax */
  1242. /* static double */
  1243. /* ln2hi  =  6.9314718055829871446E-1    , Hex  2^  0   *  .B17217F7D00000 */
  1244. /* ln2lo  =  1.6465949582897081279E-12   , Hex  2^-39   *  .E7BCD5E4F1D9CC */
  1245. /* sqrt2  =  1.4142135623730950622E0     ; Hex  2^  1   *  .B504F333F9DE65 */
  1246. static long     ln2hix[] = { _0x(7217,4031), _0x(0000,f7d0)};
  1247. static long     ln2lox[] = { _0x(bcd5,2ce7), _0x(d9cc,e4f1)};
  1248. static long     sqrt2x[] = { _0x(04f3,40b5), _0x(de65,33f9)};
  1249. #define    ln2hi    (*(double*)ln2hix)
  1250. #define    ln2lo    (*(double*)ln2lox)
  1251. #define    sqrt2    (*(double*)sqrt2x)
  1252. #else /* defined(vax)||defined(tahoe) */
  1253. static double
  1254. ln2hi  =  6.9314718036912381649E-1    , /*Hex  2^ -1   *  1.62E42FEE00000 */
  1255. ln2lo  =  1.9082149292705877000E-10   , /*Hex  2^-33   *  1.A39EF35793C76 */
  1256. sqrt2  =  1.4142135623730951455E0     ; /*Hex  2^  0   *  1.6A09E667F3BCD */
  1257. #endif /* defined(vax)||defined(tahoe) */
  1258. /*******************************************************************************
  1259. *
  1260. * log - compute a natural logarithm (ANSI)
  1261. *
  1262. * This routine returns the natural logarithm of <x>
  1263. * in double precision (IEEE double, 53 bits).
  1264. *
  1265. * A domain error occurs if the argument is negative.  A range error may occur
  1266. * if the argument is zero.
  1267. *
  1268. * INTERNAL:
  1269. * Method:
  1270. * (1) Argument Reduction: find <k> and <f> such that:
  1271. *
  1272. *         x = 2^k * (1+f)
  1273. *
  1274. *     where:
  1275. *
  1276. *         sqrt(2)/2 < 1+f < sqrt(2)
  1277. *
  1278. * (2) Let s = f/(2+f); based on:
  1279. *
  1280. *         log(1+f) = log(1+s) - log(1-s) = 2s + 2/3 s**3 + 2/5 s**5 + .....
  1281. *
  1282. *     log(1+f) is computed by:
  1283. *
  1284. *         log(1+f) = 2s + s*log__L(s*s)
  1285. *
  1286. *     where:
  1287. *
  1288. *        log__L(z) = z*(L1 + z*(L2 + z*(... (L6 + z*L7)...)))
  1289. *
  1290. * (3) Finally:
  1291. *
  1292. *         log(x) = k*ln2 + log(1+f)
  1293. *
  1294. *     (Here n*ln2 will be stored
  1295. *     in two floating-point numbers: n*ln2hi + n*ln2lo; n*ln2hi is exact
  1296. *     since the last 20 bits of ln2hi is 0.)
  1297. *
  1298. * INCLUDE FILES: math.h
  1299. *
  1300. * RETURNS: The double-precision natural logarithm of <x>.
  1301. *
  1302. * Special cases:
  1303. *     If <x> < 0 (including -INF), it returns NaN with signal.
  1304. *     If <x> is +INF, it returns <x> with no signal.
  1305. *     If <x> is 0, it returns -INF with signal.
  1306. *     If <x> is NaN it returns <x> with no signal.
  1307. *
  1308. * SEE ALSO: mathALib
  1309. *
  1310. * INTERNAL
  1311. * Coded in C by K.C. Ng, 1/19/85;
  1312. * Revised by K.C. Ng on 2/7/85, 3/7/85, 3/24/85, 4/16/85.
  1313. */
  1314. double log
  1315.     (
  1316.     double x /* value to compute the natural logarithm of */
  1317.     )
  1318.     {
  1319. static double zero=0.0, negone= -1.0, half=1.0/2.0;
  1320. double logb(),scalb(),copysign(),log__L(),s,z,t;
  1321. int k,n,finite();
  1322. #if !defined(vax)&&!defined(tahoe)
  1323. if(x!=x) return(x); /* x is NaN */
  1324. #endif /* !defined(vax)&&!defined(tahoe) */
  1325. if(finite(x)) {
  1326.    if( x > zero ) {
  1327.    /* argument reduction */
  1328.       k=logb(x);   x=scalb(x,-k);
  1329.       if(k == -1022) /* subnormal no. */
  1330.    {n=logb(x); x=scalb(x,-n); k+=n;}
  1331.       if(x >= sqrt2 ) {k += 1; x *= half;}
  1332.       x += negone ;
  1333.    /* compute log(1+x)  */
  1334.               s=x/(2+x); t=x*x*half;
  1335.       z=k*ln2lo+s*(t+log__L(s*s));
  1336.       x += (z - t) ;
  1337.       return(k*ln2hi+x);
  1338.    }
  1339. /* end of if (x > zero) */
  1340.    else {
  1341. #if defined(vax)||defined(tahoe)
  1342. extern double infnan();
  1343. if ( x == zero )
  1344.     return (infnan(-ERANGE)); /* -INF */
  1345. else
  1346.     return (infnan(EDOM)); /* NaN */
  1347. #else /* defined(vax)||defined(tahoe) */
  1348. /* zero argument, return -INF with signal */
  1349. if ( x == zero )
  1350.     return( negone/zero );
  1351. /* negative argument, return NaN with signal */
  1352. else
  1353.     return ( zero / zero );
  1354. #endif /* defined(vax)||defined(tahoe) */
  1355.     }
  1356. }
  1357.     /* end of if (finite(x)) */
  1358.     /* NOTREACHED if defined(vax)||defined(tahoe) */
  1359.     /* log(-INF) is NaN with signal */
  1360. else if (x<0)
  1361.     return(zero/zero);
  1362.     /* log(+INF) is +INF */
  1363. else return(x);
  1364.     }
  1365. /* log10.c - math routine */
  1366. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1367. /*
  1368. modification history
  1369. --------------------
  1370. 01e,05feb93,jdi  doc changes based on kdl review.
  1371. 01d,02dec92,jdi  doc tweaks.
  1372. 01c,28oct92,jdi  documentation cleanup.
  1373. 01b,20sep92,smb  documentation additions
  1374. 01a,08jul92,smb  documentation.
  1375. */
  1376. /*
  1377. DESCRIPTION
  1378. * Copyright (c) 1985 Regents of the University of California.
  1379. * All rights reserved.
  1380. *
  1381. * Redistribution and use in source and binary forms are permitted
  1382. * provided that the above copyright notice and this paragraph are
  1383. * duplicated in all such forms and that any documentation,
  1384. * advertising materials, and other materials related to such
  1385. * distribution and use acknowledge that the software was developed
  1386. * by the University of California, Berkeley.  The name of the
  1387. * University may not be used to endorse or promote products derived
  1388. * from this software without specific prior written permission.
  1389. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1390. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1391. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1392. *
  1393. * All recipients should regard themselves as participants in an ongoing
  1394. * research project and hence should feel obligated to report their
  1395. * experiences (good or bad) with these elementary function codes, using
  1396. * the sendbug(8) program, to the authors.
  1397. *
  1398. SEE ALSO: American National Standard X3.159-1989
  1399. NOMANUAL
  1400. */
  1401. #include "vxWorks.h"
  1402. #include "math.h"
  1403. #if defined(vax)||defined(tahoe) /* VAX D format (56 bits) */
  1404. #ifdef vax
  1405. #define _0x(A,B) 0x/**/A/**/B
  1406. #else /* vax */
  1407. #define _0x(A,B) 0x/**/B/**/A
  1408. #endif /* vax */
  1409. /* static double */
  1410. /* ln10hi =  2.3025850929940456790E0     ; Hex   2^  2   *  .935D8DDDAAA8AC */
  1411. static long    ln10hix[] = { _0x(5d8d,4113), _0x(a8ac,ddaa)};
  1412. #define   ln10hi    (*(double*)ln10hix)
  1413. #else /* defined(vax)||defined(tahoe) */
  1414. static double
  1415. ivln10 =  4.3429448190325181667E-1    ; /*Hex   2^ -2   *  1.BCB7B1526E50E */
  1416. #endif /* defined(vax)||defined(tahoe) */
  1417. /*******************************************************************************
  1418. *
  1419. * log10 - compute a base-10 logarithm (ANSI)
  1420. *
  1421. * This routine returns the base 10 logarithm of <x> in
  1422. * double precision (IEEE double, 53 bits).
  1423. *
  1424. * A domain error occurs if the argument is negative.  A range error may
  1425. * if the argument is zero.
  1426. *
  1427. * INTERNAL:
  1428. * Method:
  1429. *                  log(x)
  1430. *     log10(x) = ---------  or  [1/log(10)]*log(x)
  1431. *                 log(10)
  1432. *
  1433. *     [log(10)]   rounded to 56 bits has error  .0895  ulps,
  1434. *     [1/log(10)] rounded to 53 bits has error  .198   ulps;
  1435. *     therefore, for better accuracy, in VAX D format, we divide
  1436. *     log(x) by log(10), but in IEEE Double format, we multiply
  1437. *     log(x) by [1/log(10)].
  1438. *
  1439. * INCLUDE FILES: math.h
  1440. *
  1441. * RETURNS: The double-precision base-10 logarithm of <x>.
  1442. *
  1443. * Special cases:
  1444. *     If <x> < 0, log10() returns NaN with signal.
  1445. *     if <x> is +INF, it returns <x> with no signal.
  1446. *     if <x> is 0, it returns -INF with signal.
  1447. *     if <x> is NaN it returns <x> with no signal.
  1448. *
  1449. * SEE ALSO: mathALib
  1450. *
  1451. * INTERNAL:
  1452. * Coded in C by K.C. Ng, 1/20/85;
  1453. * Revised by K.C. Ng on 1/23/85, 3/7/85, 4/16/85.
  1454. */
  1455. double log10
  1456.     (
  1457.     double x /* value to compute the base-10 logarithm of */
  1458.     )
  1459.     {
  1460. double log();
  1461. #if defined(vax)||defined(tahoe)
  1462. return(log(x)/ln10hi);
  1463. #else /* defined(vax)||defined(tahoe) */
  1464. return(ivln10*log(x));
  1465. #endif /* defined(vax)||defined(tahoe) */
  1466.     }
  1467. /* modf.c - separate floating-point number into integer and fraction parts */
  1468. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1469. /*
  1470. modification history
  1471. --------------------
  1472. 01i,05feb93,jdi  doc changes based on kdl review.
  1473. 01h,02dec92,jdi  doc tweaks.
  1474. 01g,28oct92,jdi  documentation cleanup.
  1475. 01f,20sep92,smb  documentation additions
  1476. 01e,10sep92,wmd  changed dummy function for i960KB from printf to bcopy.
  1477. 01d,04sep92,wmd  restored to rev 1b, instead modified mathP.h using  _BYTE_ORDER 
  1478.  conditionals to flip the contents of struct DOUBLE.  Added a dummy
  1479.  printf() in order to force compiler to compile code correctly for i960kb.
  1480. 01c,03sep92,wmd  modified modf() for the i960, word order for DOUBLE is reversed.
  1481. 01b,25jul92,kdl  replaced modf() routine contents with version from floatLib.c;
  1482.  deleted isnan(), iszero(), isinf(), _d_type().
  1483. 01a,08jul92,smb  documentation.
  1484. */
  1485. /*
  1486. DESCRIPTION
  1487. SEE ALSO: American National Standard X3.159-1989
  1488. NOMANUAL
  1489. */
  1490. #include "vxWorks.h"
  1491. #include "math.h"
  1492. #include "stddef.h"
  1493. #include "errno.h"
  1494. #include "private/mathP.h"
  1495. /*******************************************************************************
  1496. *
  1497. * modf - separate a floating-point number into integer and fraction parts (ANSI)
  1498. *
  1499. * This routine stores the integer portion of <value>
  1500. * in <pIntPart> and returns the fractional portion.
  1501. * Both parts are double precision and will have the same sign as <value>.
  1502. *
  1503. * INCLUDE FILES: math.h
  1504. *
  1505. * RETURNS: The double-precision fractional portion of <value>.
  1506. *
  1507. * SEE ALSO: frexp(), ldexp()
  1508. */
  1509. double modf
  1510.     (
  1511.     double value,               /* value to split                  */
  1512.     double *pIntPart            /* where integer portion is stored */
  1513.     )
  1514.     {
  1515.     DOUBLE  dat;
  1516.     FAST int  exp;
  1517.     FAST double fracPart;
  1518.     FAST double intPart;
  1519.     int  negflag = (value < 0);
  1520.     if (negflag)
  1521.         value = -value; /* make it positive */
  1522.     dat.ddat = value;
  1523.     /* Separate the exponent, and change it from biased to 2's comp. */
  1524.     exp = ((dat.ldat.l1 & 0x7ff00000) >> 20) - 1023;
  1525. #if CPU==I960KB
  1526.     bcopy ((char *)&negflag, (char *)&negflag, 0);
  1527. #endif  /* CPU==I960KB - to force gcc960 to compile correct code for the i960kb */
  1528.     
  1529.     if (exp <= -1)
  1530.         {
  1531. /* If exponent is negative, fracPart == |value|, and intPart == 0. */
  1532.         fracPart = value;
  1533.         intPart = 0.;
  1534.         }
  1535.     /* clear the fractional part in dat */
  1536.     else if (exp <= 20)
  1537.         {
  1538.         dat.ldat.l1 &= (-1 << (20 - exp));
  1539.         dat.ldat.l2 = 0;
  1540.         intPart = dat.ddat;
  1541.         fracPart = value - intPart;
  1542.         }
  1543.     else if (exp <= 52)
  1544.         {
  1545.         dat.ldat.l2 &= (-1 << (52 - exp));
  1546.         intPart = dat.ddat;
  1547.         fracPart = value - intPart;
  1548. }
  1549.     else
  1550.         {
  1551.         fracPart = 0.;
  1552.         intPart = value;
  1553.         }
  1554.     *pIntPart = (negflag ? -intPart : intPart);
  1555.     return (negflag ? -fracPart : fracPart);
  1556.     }
  1557. /* pow.c - math routines */
  1558. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1559. /*
  1560. modification history
  1561. --------------------
  1562. 01e,05feb93,jdi  doc changes based on kdl review.
  1563. 01d,02dec92,jdi  doc tweaks.
  1564. 01c,28oct92,jdi  documentation cleanup.
  1565. 01b,20sep92,smb  documentation additions
  1566. 01a,08jul92,smb  documentation.
  1567. */
  1568. /*
  1569. DESCRIPTION
  1570. * Copyright (c) 1985 Regents of the University of California.
  1571. * All rights reserved.
  1572. *
  1573. * Redistribution and use in source and binary forms are permitted
  1574. * provided that the above copyright notice and this paragraph are
  1575. * duplicated in all such forms and that any documentation,
  1576. * advertising materials, and other materials related to such
  1577. * distribution and use acknowledge that the software was developed
  1578. * by the University of California, Berkeley.  The name of the
  1579. * University may not be used to endorse or promote products derived
  1580. * from this software without specific prior written permission.
  1581. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1582. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1583. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1584. *
  1585. * All recipients should regard themselves as participants in an ongoing
  1586. * research project and hence should feel obligated to report their
  1587. * experiences (good or bad) with these elementary function codes, using
  1588. * the sendbug(8) program, to the authors.
  1589. *
  1590. SEE ALSO: American National Standard X3.159-1989
  1591. NOMANUAL
  1592. */
  1593. #include "vxWorks.h"
  1594. #include "math.h"
  1595. #include "private/mathP.h"
  1596. #if defined(vax)||defined(tahoe) /* VAX D format */
  1597. #include <errno.h>
  1598. extern double infnan();
  1599. #ifdef vax
  1600. #define _0x(A,B) 0x/**/A/**/B
  1601. #else /* vax */
  1602. #define _0x(A,B) 0x/**/B/**/A
  1603. #endif /* vax */
  1604. /* static double */
  1605. /* ln2hi  =  6.9314718055829871446E-1    , Hex  2^  0   *  .B17217F7D00000 */
  1606. /* ln2lo  =  1.6465949582897081279E-12   , Hex  2^-39   *  .E7BCD5E4F1D9CC */
  1607. /* invln2 =  1.4426950408889634148E0     , Hex  2^  1   *  .B8AA3B295C17F1 */
  1608. /* sqrt2  =  1.4142135623730950622E0     ; Hex  2^  1   *  .B504F333F9DE65 */
  1609. static long     ln2hix[] = { _0x(7217,4031), _0x(0000,f7d0)};
  1610. static long     ln2lox[] = { _0x(bcd5,2ce7), _0x(d9cc,e4f1)};
  1611. static long    invln2x[] = { _0x(aa3b,40b8), _0x(17f1,295c)};
  1612. static long     sqrt2x[] = { _0x(04f3,40b5), _0x(de65,33f9)};
  1613. #define    ln2hi    (*(double*)ln2hix)
  1614. #define    ln2lo    (*(double*)ln2lox)
  1615. #define   invln2    (*(double*)invln2x)
  1616. #define    sqrt2    (*(double*)sqrt2x)
  1617. #else /* defined(vax)||defined(tahoe) */
  1618. static double
  1619. ln2hi  =  6.9314718036912381649E-1    , /*Hex  2^ -1   *  1.62E42FEE00000 */
  1620. ln2lo  =  1.9082149292705877000E-10   , /*Hex  2^-33   *  1.A39EF35793C76 */
  1621. invln2 =  1.4426950408889633870E0     , /*Hex  2^  0   *  1.71547652B82FE */
  1622. sqrt2  =  1.4142135623730951455E0     ; /*Hex  2^  0   *  1.6A09E667F3BCD */
  1623. #endif /* defined(vax)||defined(tahoe) */
  1624. static double zero=0.0, half=1.0/2.0, one=1.0, two=2.0, negone= -1.0;
  1625. /*******************************************************************************
  1626. *
  1627. * pow - compute the value of a number raised to a specified power (ANSI)
  1628. *
  1629. * This routine returns <x> to the power of <y> in
  1630. * double precision (IEEE double, 53 bits).
  1631. *
  1632. * A domain error occurs if <x> is negative and <y> is not an integral value.
  1633. * A domain error occurs if the result cannot be represented when <x> is zero
  1634. * and <y> is less than or equal to zero.  A range error may occur.
  1635. *
  1636. * INTERNAL:
  1637. * Method:
  1638. * (1) Compute and return log(x) in three pieces:
  1639. *
  1640. *         log(x) = n*ln2 + hi + lo
  1641. *
  1642. *     where <n> is an integer.
  1643. *
  1644. * (2) Perform y*log(x) by simulating multi-precision arithmetic and
  1645. *     return the answer in three pieces:
  1646. *
  1647. *         y*log(x) = m*ln2 + hi + lo
  1648. *
  1649. *     where <m> is an integer.
  1650. *
  1651. * (3) Return:
  1652. *
  1653. *         x**y = exp(y*log(x)) = 2^m * ( exp(hi+lo) )
  1654. *
  1655. * INCLUDE FILES: math.h
  1656. *
  1657. * RETURNS: The double-precision value of <x> to the power of <y>.
  1658. *
  1659. * Special cases:
  1660. * .TS
  1661. * tab(|);
  1662. * l0 c0 l.
  1663. *     (anything) ** 0                       | is | 1
  1664. *     (anything) ** 1                       | is | itself
  1665. *     (anything) ** NaN                     | is | NaN
  1666. *     NaN ** (anything except 0)            | is | NaN
  1667. *     +-(anything > 1) ** +INF              | is | +INF
  1668. *     +-(anything > 1) ** -INF              | is | +0
  1669. *     +-(anything < 1) ** +INF              | is | +0
  1670. *     +-(anything < 1) ** -INF              | is | +INF
  1671. *     +-1 ** +-INF                          | is | NaN, signal INVALID
  1672. *     +0 ** +(anything non-0, NaN)          | is | +0
  1673. *     -0 ** +(anything non-0, NaN, odd int) | is | +0
  1674. *     +0 ** -(anything non-0, NaN)          | is | +INF, signal DIV-BY-ZERO
  1675. *     -0 ** -(anything non-0, NaN, odd int) | is | +INF with signal
  1676. *     -0 ** (odd integer)                   | =  | -(+0 ** (odd integer))
  1677. *     +INF ** +(anything except 0, NaN)     | is | +INF
  1678. *     +INF ** -(anything except 0, NaN)     | is | +0
  1679. *     -INF ** (odd integer)                 | =  | -(+INF ** (odd integer))
  1680. *     -INF ** (even integer)                | =  | (+INF ** (even integer))
  1681. *     -INF ** -(any non-integer, NaN)       | is | NaN with signal
  1682. *     -(x=anything) ** (k=integer)          | is | (-1)**k * (x ** k)
  1683. *     -(anything except 0) ** (non-integer) | is | NaN with signal
  1684. * .TE
  1685. *
  1686. * SEE ALSO: mathALib
  1687. *
  1688. * INTERNAL:
  1689. * Coded in C by K.C. Ng, 1/8/85;
  1690. * Revised by K.C. Ng on 7/10/85.
  1691. */
  1692. double pow
  1693.     (
  1694.     double x, /* operand  */
  1695.     double y /* exponent */
  1696.     )
  1697.     {
  1698. double drem(),pow_p(),copysign(),t;
  1699. int finite();
  1700. if     (y==zero)      return(one);
  1701. else if(y==one
  1702. #if !defined(vax)&&!defined(tahoe)
  1703. ||x!=x
  1704. #endif /* !defined(vax)&&!defined(tahoe) */
  1705. ) return( x );      /* if x is NaN or y=1 */
  1706. #if !defined(vax)&&!defined(tahoe)
  1707. else if(y!=y)         return( y );      /* if y is NaN */
  1708. #endif /* !defined(vax)&&!defined(tahoe) */
  1709. else if(!finite(y))                     /* if y is INF */
  1710.      if((t=copysign(x,one))==one) return(zero/zero);
  1711.      else if(t>one) return((y>zero)?y:zero);
  1712.      else return((y<zero)?-y:zero);
  1713. else if(y==two)       return(x*x);
  1714. else if(y==negone)    return(one/x);
  1715.     /* sign(x) = 1 */
  1716. else if(copysign(one,x)==one) return(pow_p(x,y));
  1717.     /* sign(x)= -1 */
  1718. /* if y is an even integer */
  1719. else if ( (t=drem(y,two)) == zero) return( pow_p(-x,y) );
  1720. /* if y is an odd integer */
  1721. else if (copysign(t,one) == one) return( -pow_p(-x,y) );
  1722. /* Henceforth y is not an integer */
  1723. else if(x==zero) /* x is -0 */
  1724.     return((y>zero)?-x:one/(-x));
  1725. else { /* return NaN */
  1726. #if defined(vax)||defined(tahoe)
  1727.     return (infnan(EDOM)); /* NaN */
  1728. #else /* defined(vax)||defined(tahoe) */
  1729.     return(zero/zero);
  1730. #endif /* defined(vax)||defined(tahoe) */
  1731. }
  1732.     }
  1733. /****************************************************************************
  1734. *
  1735. * pow_p -
  1736. *
  1737. * pow_p(x,y) return x**y for x with sign=1 and finite y *
  1738. *
  1739. * RETURN:
  1740. * NOMANUAL
  1741. */
  1742. double pow_p(x,y)
  1743. double x,y;
  1744. {
  1745.         double logb(),scalb(),copysign(),log__L(),exp__E();
  1746.         double c,s,t,z,tx,ty;
  1747. #ifdef tahoe
  1748. double tahoe_tmp;
  1749. #endif /* tahoe */
  1750.         float sx,sy;
  1751. long k=0;
  1752.         int n,m;
  1753. if(x==zero||!finite(x)) {           /* if x is +INF or +0 */
  1754. #if defined(vax)||defined(tahoe)
  1755.      return((y>zero)?x:infnan(ERANGE)); /* if y<zero, return +INF */
  1756. #else /* defined(vax)||defined(tahoe) */
  1757.      return((y>zero)?x:one/x);
  1758. #endif /* defined(vax)||defined(tahoe) */
  1759. }
  1760. if(x==1.0) return(x); /* if x=1.0, return 1 since y is finite */
  1761.     /* reduce x to z in [sqrt(1/2)-1, sqrt(2)-1] */
  1762.         z=scalb(x,-(n=logb(x)));
  1763. #if !defined(vax)&&!defined(tahoe) /* IEEE double; subnormal number */
  1764.         if(n <= -1022) {n += (m=logb(z)); z=scalb(z,-m);}
  1765. #endif /* !defined(vax)&&!defined(tahoe) */
  1766.         if(z >= sqrt2 ) {n += 1; z *= half;}  z -= one ;
  1767.     /* log(x) = nlog2+log(1+z) ~ nlog2 + t + tx */
  1768. s=z/(two+z); c=z*z*half; tx=s*(c+log__L(s*s));
  1769. t= z-(c-tx); tx += (z-t)-c;
  1770.    /* if y*log(x) is neither too big nor too small */
  1771. if((s=logb(y)+logb(n+t)) < 12.0)
  1772.     if(s>-60.0) {
  1773. /* compute y*log(x) ~ mlog2 + t + c */
  1774.          s=y*(n+invln2*t);
  1775.                 m=s+copysign(half,s);   /* m := nint(y*log(x)) */
  1776. k=y;
  1777. if((double)k==y) { /* if y is an integer */
  1778.     k = m-k*n;
  1779.     sx=t; tx+=(t-sx); }
  1780. else { /* if y is not an integer */
  1781.     k =m;
  1782.       tx+=n*ln2lo;
  1783.     sx=(c=n*ln2hi)+t; tx+=(c-sx)+t; }
  1784.    /* end of checking whether k==y */
  1785.                 sy=y; ty=y-sy;          /* y ~ sy + ty */
  1786. #ifdef tahoe
  1787. s = (tahoe_tmp = sx)*sy-k*ln2hi;
  1788. #else /* tahoe */
  1789. s=(double)sx*sy-k*ln2hi;        /* (sy+ty)*(sx+tx)-kln2 */
  1790. #endif /* tahoe */
  1791. z=(tx*ty-k*ln2lo);
  1792. tx=tx*sy; ty=sx*ty;
  1793. t=ty+z; t+=tx; t+=s;
  1794. c= -((((t-s)-tx)-ty)-z);
  1795.     /* return exp(y*log(x)) */
  1796. t += exp__E(t,c); return(scalb(one+t,m));
  1797.      }
  1798. /* end of if log(y*log(x)) > -60.0 */
  1799.     else
  1800. /* exp(+- tiny) = 1 with inexact flag */
  1801. {ln2hi+ln2lo; return(one);}
  1802.     else if(copysign(one,y)*(n+invln2*t) <zero)
  1803. /* exp(-(big#)) underflows to zero */
  1804.          return(scalb(one,-5000));
  1805.     else
  1806.         /* exp(+(big#)) overflows to INF */
  1807.      return(scalb(one, 5000));
  1808. }
  1809. /* sincos.c - math routines */
  1810. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1811. /*
  1812. modification history
  1813. --------------------
  1814. 01f,05feb93,jdi  doc changes based on kdl review.
  1815. 01e,02dec92,jdi  doc tweaks.
  1816. 01d,28oct92,jdi  documentation cleanup.
  1817. 01c,21sep92,smb  changed function headers for mg.
  1818. 01b,20sep92,smb  documentation additions
  1819. 01a,08jul92,smb  documentation.
  1820. */
  1821. /*
  1822. DESCRIPTION
  1823. * Copyright (c) 1987 Regents of the University of California.
  1824. * All rights reserved.
  1825. *
  1826. * Redistribution and use in source and binary forms are permitted
  1827. * provided that the above copyright notice and this paragraph are
  1828. * duplicated in all such forms and that any documentation,
  1829. * advertising materials, and other materials related to such
  1830. * distribution and use acknowledge that the software was developed
  1831. * by the University of California, Berkeley.  The name of the
  1832. * University may not be used to endorse or promote products derived
  1833. * from this software without specific prior written permission.
  1834. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1835. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1836. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1837. *
  1838. * All recipients should regard themselves as participants in an ongoing
  1839. * research project and hence should feel obligated to report their
  1840. * experiences (good or bad) with these elementary function codes, using
  1841. * the sendbug(8) program, to the authors.
  1842. *
  1843. SEE ALSO: American National Standard X3.159-1989
  1844. NOMANUAL
  1845. */
  1846. #include "vxWorks.h"
  1847. #include "math.h"
  1848. #include "private/trigP.h"
  1849. /*******************************************************************************
  1850. *
  1851. * sin - compute a sine (ANSI)
  1852. *
  1853. * This routine computes the sine of <x> in double precision.
  1854. * The angle <x> is expressed in radians.
  1855. *
  1856. * INCLUDE FILES: math.h
  1857. *
  1858. * RETURNS: The double-precision sine of <x>.
  1859. *
  1860. * SEE ALSO: mathALib
  1861. */
  1862. double sin
  1863.     (
  1864.     double x /* angle in radians */
  1865.     )
  1866.     {
  1867. double a,c,z;
  1868.         if(!finite(x)) /* sin(NaN) and sin(INF) must be NaN */
  1869. return x-x;
  1870. x=drem(x,PI2); /* reduce x into [-PI,PI] */
  1871. a=copysign(x,one);
  1872. if (a >= PIo4) {
  1873. if(a >= PI3o4) /* ... in [3PI/4,PI] */
  1874. x = copysign((a = PI-a),x);
  1875. else { /* ... in [PI/4,3PI/4]  */
  1876. a = PIo2-a; /* rtn. sign(x)*C(PI/2-|x|) */
  1877. z = a*a;
  1878. c = cos__C(z);
  1879. z *= half;
  1880. a = (z >= thresh ? half-((z-half)-c) : one-(z-c));
  1881. return copysign(a,x);
  1882. }
  1883. }
  1884. if (a < small) { /* rtn. S(x) */
  1885. big+a;
  1886. return x;
  1887. }
  1888. return x+x*sin__S(x*x);
  1889.     }
  1890. /*******************************************************************************
  1891. *
  1892. * cos - compute a cosine (ANSI)
  1893. *
  1894. * This routine computes the cosine of <x> in double precision.
  1895. * The angle <x> is expressed in radians.
  1896. *
  1897. * INCLUDE FILES: math.h
  1898. *
  1899. * RETURNS: The double-precision cosine of <x>.
  1900. *
  1901. * SEE ALSO: mathALib
  1902. */
  1903. double cos
  1904.     (
  1905.     double x /* angle in radians */
  1906.     )
  1907.     {
  1908. double a,c,z,s = 1.0;
  1909. if(!finite(x)) /* cos(NaN) and cos(INF) must be NaN */
  1910. return x-x;
  1911. x=drem(x,PI2); /* reduce x into [-PI,PI] */
  1912. a=copysign(x,one);
  1913. if (a >= PIo4) {
  1914. if (a >= PI3o4) { /* ... in [3PI/4,PI] */
  1915. a = PI-a;
  1916. s = negone;
  1917. }
  1918. else { /* ... in [PI/4,3PI/4] */
  1919. a = PIo2-a;
  1920. return a+a*sin__S(a*a); /* rtn. S(PI/2-|x|) */
  1921. }
  1922. }
  1923. if (a < small) {
  1924. big+a;
  1925. return s; /* rtn. s*C(a) */
  1926. }
  1927. z = a*a;
  1928. c = cos__C(z);
  1929. z *= half;
  1930. a = (z >= thresh ? half-((z-half)-c) : one-(z-c));
  1931. return copysign(a,s);
  1932.     }
  1933. /* sinh.c - math routine */
  1934. /* Copyright 1992-1994 Wind River Systems, Inc. */
  1935. /*
  1936. modification history
  1937. --------------------
  1938. 01f,09dec94,rhp  fix descriptions of hyperbolic fns.
  1939. 01e,05feb93,jdi  doc changes based on kdl review.
  1940. 01d,02dec92,jdi  doc tweaks.
  1941. 01c,28oct92,jdi  documentation cleanup.
  1942. 01b,20sep92,smb  documentation additions
  1943. 01a,08jul92,smb  documentation.
  1944. */
  1945. /*
  1946. DESCRIPTION
  1947. * Copyright (c) 1985 Regents of the University of California.
  1948. * All rights reserved.
  1949. *
  1950. * Redistribution and use in source and binary forms are permitted
  1951. * provided that the above copyright notice and this paragraph are
  1952. * duplicated in all such forms and that any documentation,
  1953. * advertising materials, and other materials related to such
  1954. * distribution and use acknowledge that the software was developed
  1955. * by the University of California, Berkeley.  The name of the
  1956. * University may not be used to endorse or promote products derived
  1957. * from this software without specific prior written permission.
  1958. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1959. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1960. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1961. *
  1962. * All recipients should regard themselves as participants in an ongoing
  1963. * research project and hence should feel obligated to report their
  1964. * experiences (good or bad) with these elementary function codes, using
  1965. * the sendbug(8) program, to the authors.
  1966. *
  1967. SEE ALSO: American National Standard X3.159-1989
  1968. NOMANUAL
  1969. */
  1970. #include "vxWorks.h"
  1971. #include "math.h"
  1972. #if defined(vax)||defined(tahoe)
  1973. #ifdef vax
  1974. #define _0x(A,B) 0x/**/A/**/B
  1975. #else /* vax */
  1976. #define _0x(A,B) 0x/**/B/**/A
  1977. #endif /* vax */
  1978. /* static double */
  1979. /* mln2hi =  8.8029691931113054792E1     , Hex  2^  7   *  .B00F33C7E22BDB */
  1980. /* mln2lo = -4.9650192275318476525E-16   , Hex  2^-50   * -.8F1B60279E582A */
  1981. /* lnovfl =  8.8029691931113053016E1     ; Hex  2^  7   *  .B00F33C7E22BDA */
  1982. static long    mln2hix[] = { _0x(0f33,43b0), _0x(2bdb,c7e2)};
  1983. static long    mln2lox[] = { _0x(1b60,a70f), _0x(582a,279e)};
  1984. static long    lnovflx[] = { _0x(0f33,43b0), _0x(2bda,c7e2)};
  1985. #define   mln2hi    (*(double*)mln2hix)
  1986. #define   mln2lo    (*(double*)mln2lox)
  1987. #define   lnovfl    (*(double*)lnovflx)
  1988. #else /* defined(vax)||defined(tahoe) */
  1989. static double
  1990. mln2hi =  7.0978271289338397310E2     , /*Hex  2^ 10   *  1.62E42FEFA39EF */
  1991. mln2lo =  2.3747039373786107478E-14   , /*Hex  2^-45   *  1.ABC9E3B39803F */
  1992. lnovfl =  7.0978271289338397310E2     ; /*Hex  2^  9   *  1.62E42FEFA39EF */
  1993. #endif /* defined(vax)||defined(tahoe) */
  1994. #if defined(vax)||defined(tahoe)
  1995. static max = 126                      ;
  1996. #else /* defined(vax)||defined(tahoe) */
  1997. static max = 1023                     ;
  1998. #endif /* defined(vax)||defined(tahoe) */
  1999. /*******************************************************************************
  2000. *
  2001. * sinh - compute a hyperbolic sine (ANSI)
  2002. *
  2003. * This routine returns the hyperbolic sine of <x> in
  2004. * double precision (IEEE double, 53 bits).
  2005. *
  2006. * A range error occurs if <x> is too large.
  2007. *
  2008. * INTERNAL:
  2009. * Method:
  2010. *
  2011. * (1) Reduce <x> to non-negative by sinh(-x) = - sinh(x).
  2012. *
  2013. * (2)
  2014. *                                          expm1(x) + expm1(x)/(expm1(x)+1)
  2015. *        0 <= x <= lnovfl     : sinh(x) := --------------------------------
  2016. *                                   2
  2017. *         lnovfl <= x <= lnovfl+ln2 : sinh(x) := expm1(x)/2 (avoid overflow)
  2018. *     lnovfl+ln2 <  x <  INF        :  overflow to INF
  2019. *    
  2020. * INCLUDE FILES: math.h
  2021. *
  2022. * RETURNS:
  2023. * The double-precision hyperbolic sine of <x>.
  2024. *
  2025. * Special cases:
  2026. *     If <x> is +INF, -INF, or NaN, sinh() returns <x>.
  2027. *
  2028. * SEE ALSO: mathALib
  2029. */
  2030. double sinh
  2031.     (
  2032.     double x /* number whose hyperbolic sine is required */
  2033.     )
  2034.     {
  2035. static double  one=1.0, half=1.0/2.0 ;
  2036. double expm1(), t, scalb(), copysign(), sign;
  2037. #if !defined(vax)&&!defined(tahoe)
  2038. if(x!=x) return(x); /* x is NaN */
  2039. #endif /* !defined(vax)&&!defined(tahoe) */
  2040. sign=copysign(one,x);
  2041. x=copysign(x,one);
  2042. if(x<lnovfl)
  2043.     {t=expm1(x); return(copysign((t+t/(one+t))*half,sign));}
  2044. else if(x <= lnovfl+0.7)
  2045. /* subtract x by ln(2^(max+1)) and return 2^max*exp(x)
  2046.      to avoid unnecessary overflow */
  2047.     return(copysign(scalb(one+expm1((x-mln2hi)-mln2lo),max),sign));
  2048. else  /* sinh(+-INF) = +-INF, sinh(+-big no.) overflow to +-INF */
  2049.     return( expm1(x)*sign );
  2050.     }
  2051. /* sqrt.c - software version of sqare-root routine */
  2052. /* Copyright 1992-1994 Wind River Systems, Inc. */
  2053. /*
  2054. modification history
  2055. --------------------
  2056. 01f,02sep93,jwt  moved sparcHardSqrt to src/arch/sparc/sparcLib.c.
  2057. 01e,05feb93,jdi  doc changes based on kdl review.
  2058. 01d,02dec92,jdi  doc tweaks.
  2059. 01c,28oct92,jdi  documentation cleanup.
  2060. 01b,13oct92,jdi  mangen fixes.
  2061. 01a,23jun92,kdl  extracted from v.01d of support.c.
  2062. */
  2063. /*
  2064. DESCRIPTION
  2065. * Copyright (c) 1985 Regents of the University of California.
  2066. * All rights reserved.
  2067. *
  2068. * Redistribution and use in source and binary forms are permitted
  2069. * provided that the above copyright notice and this paragraph are
  2070. * duplicated in all such forms and that any documentation,
  2071. * advertising materials, and other materials related to such
  2072. * distribution and use acknowledge that the software was developed
  2073. * by the University of California, Berkeley.  The name of the
  2074. * University may not be used to endorse or promote products derived
  2075. * from this software without specific prior written permission.
  2076. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2077. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2078. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2079. *
  2080. * All recipients should regard themselves as participants in an ongoing
  2081. * research project and hence should feel obligated to report their
  2082. * experiences (good or bad) with these elementary function codes, using
  2083. * the sendbug(8) program, to the authors.
  2084. *
  2085. * Some IEEE standard 754 recommended functions and remainder and sqrt for
  2086. * supporting the C elementary functions.
  2087. * -------------------------------------------------------------------------
  2088. * WARNING:
  2089. *      These codes are developed (in double) to support the C elementary
  2090. * functions temporarily. They are not universal, and some of them are very
  2091. * slow (in particular, drem and sqrt is extremely inefficient). Each
  2092. * computer system should have its implementation of these functions using
  2093. * its own assembler.
  2094. * -------------------------------------------------------------------------
  2095. *
  2096. * IEEE 754 required operations:
  2097. *     drem(x,p)
  2098. *              returns  x REM y  =  x - [x/y]*y , where [x/y] is the integer
  2099. *              nearest x/y; in half way case, choose the even one.
  2100. *     sqrt(x)
  2101. *              returns the square root of x correctly rounded according to
  2102. * the rounding mod.
  2103. *
  2104. * IEEE 754 recommended functions:
  2105. * (a) copysign(x,y)
  2106. *              returns x with the sign of y.
  2107. * (b) scalb(x,N)
  2108. *              returns  x * (2**N), for integer values N.
  2109. * (c) logb(x)
  2110. *              returns the unbiased exponent of x, a signed integer in
  2111. *              double precision, except that logb(0) is -INF, logb(INF)
  2112. *              is +INF, and logb(NAN) is that NAN.
  2113. * (d) finite(x)
  2114. *              returns the value TRUE if -INF < x < +INF and returns
  2115. *              FALSE otherwise.
  2116. *
  2117. *
  2118. * CODED IN C BY K.C. NG, 11/25/84;
  2119. * REVISED BY K.C. NG on 1/22/85, 2/13/85, 3/24/85.
  2120. *
  2121. * SEE ALSO: American National Standard X3.159-1989
  2122. * NOMANUAL
  2123. */
  2124. #include "vxWorks.h"
  2125. #include "math.h"
  2126. #include "private/mathP.h"
  2127. #include "errno.h"
  2128. extern double scalb();
  2129. extern double logb();
  2130. extern int finite();
  2131. /*******************************************************************************
  2132. *
  2133. * sqrt - compute a non-negative square root (ANSI)
  2134. *
  2135. * This routine computes the non-negative square root of <x> in double
  2136. * precision.  A domain error occurs if the argument is negative.
  2137. *
  2138. * INCLUDE FILES: math.h
  2139. *
  2140. * RETURNS: The double-precision square root of <x> or 0 if <x> is negative.
  2141. *
  2142. * ERRNO: EDOM
  2143. *
  2144. * SEE ALSO: mathALib
  2145. */
  2146. double sqrt
  2147.     (
  2148.     double x /* value to compute the square root of */
  2149.     )
  2150.     {
  2151.         double q,s,b,r;
  2152.         double t,zero=0.0;
  2153.         int m,n,i;
  2154. #if defined(vax)||defined(tahoe)
  2155.         int k=54;
  2156. #else /* defined(vax)||defined(tahoe) */
  2157.         int k=51;
  2158. #endif /* defined(vax)||defined(tahoe) */
  2159. #if (CPU_FAMILY == SPARC) /* Select hardware/software square root */
  2160.         extern BOOL sparcHardSqrt;
  2161.         if (sparcHardSqrt == TRUE)
  2162.     {
  2163.     double  sqrtHw();
  2164.     return (sqrtHw (x));
  2165.     }
  2166. #endif /* (CPU_FAMILY == SPARC) */
  2167.     /* sqrt(NaN) is NaN, sqrt(+-0) = +-0 */
  2168.         if(x!=x||x==zero) return(x);
  2169.     /* sqrt(negative) is invalid */
  2170.         if(x<zero) {
  2171. #if defined(vax)||defined(tahoe)
  2172. extern double infnan();
  2173. return (infnan(EDOM)); /* NaN */
  2174. #else /* defined(vax)||defined(tahoe) */
  2175. errno = EDOM; 
  2176. return(zero/zero);
  2177. #endif /* defined(vax)||defined(tahoe) */
  2178. }
  2179.     /* sqrt(INF) is INF */
  2180.         if(!finite(x)) return(x);
  2181.     /* scale x to [1,4) */
  2182.         n=logb(x);
  2183.         x=scalb(x,-n);
  2184.         if((m=logb(x))!=0) x=scalb(x,-m);       /* subnormal number */
  2185.         m += n;
  2186.         n = m/2;
  2187.         if((n+n)!=m) {x *= 2; m -=1; n=m/2;}
  2188.     /* generate sqrt(x) bit by bit (accumulating in q) */
  2189.             q=1.0; s=4.0; x -= 1.0; r=1;
  2190.             for(i=1;i<=k;i++) {
  2191.                 t=s+1; x *= 4; r /= 2;
  2192.                 if(t<=x) {
  2193.                     s=t+t+2, x -= t; q += r;}
  2194.                 else
  2195.                     s *= 2;
  2196.                 }
  2197.     /* generate the last bit and determine the final rounding */
  2198.             r/=2; x *= 4;
  2199.             if(x==zero) goto end; 100+r; /* trigger inexact flag */
  2200.             if(s<x) {
  2201.                 q+=r; x -=s; s += 2; s *= 2; x *= 4;
  2202.                 t = (x-s)-5;
  2203.                 b=1.0+3*r/4; if(b==1.0) goto end; /* b==1 : Round-to-zero */
  2204.                 b=1.0+r/4;   if(b>1.0) t=1; /* b>1 : Round-to-(+INF) */
  2205.                 if(t>=0) q+=r; }       /* else: Round-to-nearest */
  2206.             else {
  2207.                 s *= 2; x *= 4;
  2208.                 t = (x-s)-1;
  2209.                 b=1.0+3*r/4; if(b==1.0) goto end;
  2210.                 b=1.0+r/4;   if(b>1.0) t=1;
  2211.                 if(t>=0) q+=r; }
  2212. end:        return(scalb(q,n));
  2213.     }
  2214. /* tan.c - math routines */
  2215. /* Copyright 1992-1993 Wind River Systems, Inc. */
  2216. /*
  2217. modification history
  2218. --------------------
  2219. 01f,05feb93,jdi  doc changes based on kdl review.
  2220. 01e,02dec92,jdi  doc tweaks.
  2221. 01d,28oct92,jdi  documentation cleanup.
  2222. 01c,21sep92,smb  changed function header for mg.
  2223. 01b,20sep92,smb  documentation additions
  2224. 01a,08jul92,smb  documentation.
  2225. */
  2226. /*
  2227. DESCRIPTION
  2228. * Copyright (c) 1987 Regents of the University of California.
  2229. * All rights reserved.
  2230. *
  2231. * Redistribution and use in source and binary forms are permitted
  2232. * provided that the above copyright notice and this paragraph are
  2233. * duplicated in all such forms and that any documentation,
  2234. * advertising materials, and other materials related to such
  2235. * distribution and use acknowledge that the software was developed
  2236. * by the University of California, Berkeley.  The name of the
  2237. * University may not be used to endorse or promote products derived
  2238. * from this software without specific prior written permission.
  2239. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2240. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2241. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2242. *
  2243. * All recipients should regard themselves as participants in an ongoing
  2244. * research project and hence should feel obligated to report their
  2245. * experiences (good or bad) with these elementary function codes, using
  2246. * the sendbug(8) program, to the authors.
  2247. *
  2248. SEE ALSO: American National Standard X3.159-1989
  2249. NOMANUAL
  2250. */
  2251. #include "vxWorks.h"
  2252. #include "math.h"
  2253. #include "private/trigP.h"
  2254. /*******************************************************************************
  2255. *
  2256. * tan - compute a tangent (ANSI)
  2257. *
  2258. * This routine computes the tangent of <x> in double precision.
  2259. * The angle <x> is expressed in radians.
  2260. * INCLUDE FILES: math.h
  2261. *
  2262. * RETURNS: The double-precision tangent of <x>.
  2263. *
  2264. * SEE ALSO: mathALib
  2265. */
  2266. double tan
  2267.     (
  2268.     double x /* angle in radians */
  2269.     )
  2270.     {
  2271. double a,z,ss,cc,c;
  2272. int k;
  2273. if(!finite(x)) /* tan(NaN) and tan(INF) must be NaN */
  2274. return x-x;
  2275. x = drem(x,PI); /* reduce x into [-PI/2, PI/2] */
  2276. a = copysign(x,one); /* ... = abs(x) */
  2277. if (a >= PIo4) {
  2278. k = 1;
  2279. x = copysign(PIo2-a,x);
  2280. }
  2281. else {
  2282. k = 0;
  2283. if (a < small) {
  2284. big+a;
  2285. return x;
  2286. }
  2287. }
  2288. z = x*x;
  2289. cc = cos__C(z);
  2290. ss = sin__S(z);
  2291. z *= half; /* Next get c = cos(x) accurately */
  2292. c = (z >= thresh ? half-((z-half)-cc) : one-(z-cc));
  2293. if (k == 0)
  2294. return x+(x*(z-(cc-ss)))/c; /* ... sin/cos */
  2295. #ifdef national
  2296. else if (x == zero)
  2297. return copysign(fmax,x); /* no inf on 32k */
  2298. #endif /* national */
  2299. else
  2300. return c/(x+x*ss); /* ... cos/sin */
  2301.     }
  2302. /* tanh.c - math routines */
  2303. /* Copyright 1992-1994 Wind River Systems, Inc. */
  2304. /*
  2305. modification history
  2306. --------------------
  2307. 01f,09dec94,rhp  fix man pages for hyperbolic fns.
  2308. 01e,05feb93,jdi  doc changes based on kdl review.
  2309. 01d,02dec92,jdi  doc tweaks.
  2310. 01c,28oct92,jdi  documentation cleanup.
  2311. 01b,20sep92,smb  documentation additions
  2312. 01a,08jul92,smb  documentation.
  2313. */
  2314. /*
  2315. DESCRIPTION
  2316. * Copyright (c) 1985 Regents of the University of California.
  2317. * All rights reserved.
  2318. *
  2319. * Redistribution and use in source and binary forms are permitted
  2320. * provided that the above copyright notice and this paragraph are
  2321. * duplicated in all such forms and that any documentation,
  2322. * advertising materials, and other materials related to such
  2323. * distribution and use acknowledge that the software was developed
  2324. * by the University of California, Berkeley.  The name of the
  2325. * University may not be used to endorse or promote products derived
  2326. * from this software without specific prior written permission.
  2327. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2328. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2329. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2330. *
  2331. * All recipients should regard themselves as participants in an ongoing
  2332. * research project and hence should feel obligated to report their
  2333. * experiences (good or bad) with these elementary function codes, using
  2334. * the sendbug(8) program, to the authors.
  2335. *
  2336. SEE ALSO: American National Standard X3.159-1989
  2337. NOMANUAL
  2338. */
  2339. #include "vxWorks.h"
  2340. #include "math.h"
  2341. /*******************************************************************************
  2342. *
  2343. * tanh - compute a hyperbolic tangent (ANSI)
  2344. *
  2345. * This routine returns the hyperbolic tangent of <x> in
  2346. * double precision (IEEE double, 53 bits).
  2347. *
  2348. * INTERNAL:
  2349. * Method:
  2350. *
  2351. * (1) Reduce <x> to non-negative by:
  2352. *
  2353. *         tanh(-x) = - tanh(x)
  2354. *
  2355. * (2)
  2356. *         0      <  x <=  1.e-10 :  tanh(x) := x
  2357. *
  2358. *                                               -expm1(-2x)
  2359. *         1.e-10 <  x <=  1      :  tanh(x) := --------------
  2360. *                                              expm1(-2x) + 2
  2361. *
  2362. *                                                       2
  2363. *         1      <= x <=  22.0   :  tanh(x) := 1 -  ---------------
  2364. *                                                   expm1(2x) + 2
  2365. *         22.0   <  x <= INF     :  tanh(x) := 1.
  2366. *
  2367. *     Note: 22 was chosen so that fl(1.0+2/(expm1(2*22)+2)) == 1.
  2368. *
  2369. * INCLUDE FILES: math.h
  2370. *
  2371. * RETURNS:
  2372. * The double-precision hyperbolic tangent of <x>.
  2373. *
  2374. * Special cases:
  2375. *     If <x> is NaN, tanh() returns NaN.
  2376. *
  2377. * SEE ALSO: mathALib
  2378. *
  2379. * INTERNAL:
  2380. * Coded in C by K.C. Ng, 1/8/85;
  2381. * Revised by K.C. Ng on 2/8/85, 2/11/85, 3/7/85, 3/24/85.
  2382. */
  2383. double tanh
  2384.     (
  2385.     double x /* number whose hyperbolic tangent is required */
  2386.     )
  2387.     {
  2388. static double one=1.0, two=2.0, small = 1.0e-10, big = 1.0e10;
  2389. double expm1(), t, copysign(), sign;
  2390. int finite();
  2391. #if !defined(vax)&&!defined(tahoe)
  2392. if(x!=x) return(x); /* x is NaN */
  2393. #endif /* !defined(vax)&&!defined(tahoe) */
  2394. sign=copysign(one,x);
  2395. x=copysign(x,one);
  2396. if(x < 22.0)
  2397.     if( x > one )
  2398. return(copysign(one-two/(expm1(x+x)+two),sign));
  2399.     else if ( x > small )
  2400. {t= -expm1(-(x+x)); return(copysign(t/(two-t),sign));}
  2401.     else /* raise the INEXACT flag for non-zero x */
  2402. {big+x; return(copysign(x,sign));}
  2403. else if(finite(x))
  2404.     return (sign+1.0E-37); /* raise the INEXACT flag */
  2405. else
  2406.     return(sign); /* x is +- INF */
  2407.     }