Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /* ef_acosh.c -- float version of e_acosh.c.
  2.  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
  3.  */
  4.  
  5. /*
  6.  * ====================================================
  7.  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  8.  *
  9.  * Developed at SunPro, a Sun Microsystems, Inc. business.
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software is freely granted, provided that this notice
  12.  * is preserved.
  13.  * ====================================================
  14.  *
  15.  */
  16.  
  17. #include "fdlibm.h"
  18.  
  19. #ifdef __STDC__
  20. static const float
  21. #else
  22. static float
  23. #endif
  24. one     = 1.0,
  25. ln2     = 6.9314718246e-01;  /* 0x3f317218 */
  26.  
  27. #ifdef __STDC__
  28.         float __ieee754_acoshf(float x)
  29. #else
  30.         float __ieee754_acoshf(x)
  31.         float x;
  32. #endif
  33. {      
  34.         float t;
  35.         __int32_t hx;
  36.         GET_FLOAT_WORD(hx,x);
  37.         if(hx<0x3f800000) {             /* x < 1 */
  38.             return (x-x)/(x-x);
  39.         } else if(hx >=0x4d800000) {    /* x > 2**28 */
  40.             if(!FLT_UWORD_IS_FINITE(hx)) {      /* x is inf of NaN */
  41.                 return x+x;
  42.             } else
  43.                 return __ieee754_logf(x)+ln2;   /* acosh(huge)=log(2x) */
  44.         } else if (hx==0x3f800000) {
  45.             return 0.0;                 /* acosh(1) = 0 */
  46.         } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
  47.             t=x*x;
  48.             return __ieee754_logf((float)2.0*x-one/(x+__ieee754_sqrtf(t-one)));
  49.         } else {                        /* 1<x<2 */
  50.             t = x-one;
  51.             return log1pf(t+__ieee754_sqrtf((float)2.0*t+t*t));
  52.         }
  53. }
  54.