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

VxWorks

开发平台:

C/C++

  1. /* log.c - math routines */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,05feb93,jdi  doc changes based on kdl review.
  7. 01e,02dec92,jdi  doc tweaks.
  8. 01d,28oct92,jdi  documentation cleanup.
  9. 01c,13oct92,jdi  mangen fixes.
  10. 01b,20sep92,smb  documentation additions
  11. 01a,08jul92,smb  documentation
  12. */
  13. /*
  14. DESCRIPTION
  15. * Copyright (c) 1985 Regents of the University of California.
  16. * All rights reserved.
  17. *
  18. * Redistribution and use in source and binary forms are permitted
  19. * provided that the above copyright notice and this paragraph are
  20. * duplicated in all such forms and that any documentation,
  21. * advertising materials, and other materials related to such
  22. * distribution and use acknowledge that the software was developed
  23. * by the University of California, Berkeley.  The name of the
  24. * University may not be used to endorse or promote products derived
  25. * from this software without specific prior written permission.
  26. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  27. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  28. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  29. *
  30. * All recipients should regard themselves as participants in an ongoing
  31. * research project and hence should feel obligated to report their
  32. * experiences (good or bad) with these elementary function codes, using
  33. * the sendbug(8) program, to the authors.
  34. *
  35. SEE ALSO: American National Standard X3.159-1989
  36. NOMANUAL
  37. */
  38. #include "vxWorks.h"
  39. #include "math.h"
  40. #if defined(vax)||defined(tahoe) /* VAX D format */
  41. #include <errno.h>
  42. #ifdef vax
  43. #define _0x(A,B) 0x/**/A/**/B
  44. #else /* vax */
  45. #define _0x(A,B) 0x/**/B/**/A
  46. #endif /* vax */
  47. /* static double */
  48. /* ln2hi  =  6.9314718055829871446E-1    , Hex  2^  0   *  .B17217F7D00000 */
  49. /* ln2lo  =  1.6465949582897081279E-12   , Hex  2^-39   *  .E7BCD5E4F1D9CC */
  50. /* sqrt2  =  1.4142135623730950622E0     ; Hex  2^  1   *  .B504F333F9DE65 */
  51. static long     ln2hix[] = { _0x(7217,4031), _0x(0000,f7d0)};
  52. static long     ln2lox[] = { _0x(bcd5,2ce7), _0x(d9cc,e4f1)};
  53. static long     sqrt2x[] = { _0x(04f3,40b5), _0x(de65,33f9)};
  54. #define    ln2hi    (*(double*)ln2hix)
  55. #define    ln2lo    (*(double*)ln2lox)
  56. #define    sqrt2    (*(double*)sqrt2x)
  57. #else /* defined(vax)||defined(tahoe) */
  58. static double
  59. ln2hi  =  6.9314718036912381649E-1    , /*Hex  2^ -1   *  1.62E42FEE00000 */
  60. ln2lo  =  1.9082149292705877000E-10   , /*Hex  2^-33   *  1.A39EF35793C76 */
  61. sqrt2  =  1.4142135623730951455E0     ; /*Hex  2^  0   *  1.6A09E667F3BCD */
  62. #endif /* defined(vax)||defined(tahoe) */
  63. /*******************************************************************************
  64. *
  65. * log - compute a natural logarithm (ANSI)
  66. *
  67. * This routine returns the natural logarithm of <x>
  68. * in double precision (IEEE double, 53 bits).
  69. *
  70. * A domain error occurs if the argument is negative.  A range error may occur
  71. * if the argument is zero.
  72. *
  73. * INTERNAL:
  74. * Method:
  75. * (1) Argument Reduction: find <k> and <f> such that:
  76. *
  77. *         x = 2^k * (1+f)
  78. *
  79. *     where:
  80. *
  81. *         sqrt(2)/2 < 1+f < sqrt(2)
  82. *
  83. * (2) Let s = f/(2+f); based on:
  84. *
  85. *         log(1+f) = log(1+s) - log(1-s) = 2s + 2/3 s**3 + 2/5 s**5 + .....
  86. *
  87. *     log(1+f) is computed by:
  88. *
  89. *         log(1+f) = 2s + s*log__L(s*s)
  90. *
  91. *     where:
  92. *
  93. *        log__L(z) = z*(L1 + z*(L2 + z*(... (L6 + z*L7)...)))
  94. *
  95. * (3) Finally:
  96. *
  97. *         log(x) = k*ln2 + log(1+f)
  98. *
  99. *     (Here n*ln2 will be stored
  100. *     in two floating-point numbers: n*ln2hi + n*ln2lo; n*ln2hi is exact
  101. *     since the last 20 bits of ln2hi is 0.)
  102. *
  103. * INCLUDE FILES: math.h
  104. *
  105. * RETURNS: The double-precision natural logarithm of <x>.
  106. *
  107. * Special cases:
  108. *     If <x> < 0 (including -INF), it returns NaN with signal.
  109. *     If <x> is +INF, it returns <x> with no signal.
  110. *     If <x> is 0, it returns -INF with signal.
  111. *     If <x> is NaN it returns <x> with no signal.
  112. *
  113. * SEE ALSO: mathALib
  114. *
  115. * INTERNAL
  116. * Coded in C by K.C. Ng, 1/19/85;
  117. * Revised by K.C. Ng on 2/7/85, 3/7/85, 3/24/85, 4/16/85.
  118. */
  119. double log
  120.     (
  121.     double x /* value to compute the natural logarithm of */
  122.     )
  123.     {
  124. static double zero=0.0, negone= -1.0, half=1.0/2.0;
  125. double logb(),scalb(),copysign(),log__L(),s,z,t;
  126. int k,n,finite();
  127. #if !defined(vax)&&!defined(tahoe)
  128. if(x!=x) return(x); /* x is NaN */
  129. #endif /* !defined(vax)&&!defined(tahoe) */
  130. if(finite(x)) {
  131.    if( x > zero ) {
  132.    /* argument reduction */
  133.       k=logb(x);   x=scalb(x,-k);
  134.       if(k == -1022) /* subnormal no. */
  135.    {n=logb(x); x=scalb(x,-n); k+=n;}
  136.       if(x >= sqrt2 ) {k += 1; x *= half;}
  137.       x += negone ;
  138.    /* compute log(1+x)  */
  139.               s=x/(2+x); t=x*x*half;
  140.       z=k*ln2lo+s*(t+log__L(s*s));
  141.       x += (z - t) ;
  142.       return(k*ln2hi+x);
  143.    }
  144. /* end of if (x > zero) */
  145.    else {
  146. #if defined(vax)||defined(tahoe)
  147. extern double infnan();
  148. if ( x == zero )
  149.     return (infnan(-ERANGE)); /* -INF */
  150. else
  151.     return (infnan(EDOM)); /* NaN */
  152. #else /* defined(vax)||defined(tahoe) */
  153. /* zero argument, return -INF with signal */
  154. if ( x == zero )
  155.     return( negone/zero );
  156. /* negative argument, return NaN with signal */
  157. else
  158.     return ( zero / zero );
  159. #endif /* defined(vax)||defined(tahoe) */
  160.     }
  161. }
  162.     /* end of if (finite(x)) */
  163.     /* NOTREACHED if defined(vax)||defined(tahoe) */
  164.     /* log(-INF) is NaN with signal */
  165. else if (x<0)
  166.     return(zero/zero);
  167.     /* log(+INF) is +INF */
  168. else return(x);
  169.     }