Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Written 2005 by Gregory W. Chicares <chicares@cox.net> with
  3.  * help from Danny Smith. dannysmith@users.sourceforge.net>.
  4.  * Public domain.
  5.  *
  6.  * F2XM1's input is constrained to (-1, +1), so the domain of
  7.  * 'x * LOG2EL' is (-LOGE2L, +LOGE2L). Outside that domain,
  8.  * delegating to expl() handles C99 7.12.6.3/2 range errors.
  9.  *
  10.  * Constants from moshier.net, file cephes/ldouble/constl.c,
  11.  * are used instead of M_LN2 and M_LOG2E, which would not be
  12.  * visible with 'gcc std=c99'.  The use of these extended precision
  13.  * constants also allows gcc to replace them with x87 opcodes.
  14.  */
  15.  
  16. #include <math.h> /* expl() */
  17. #include "cephes_mconf.h"
  18.  
  19. long double expm1l (long double x)
  20. {
  21.   if (fabsl(x) < LOGE2L)
  22.     {
  23.       x *= LOG2EL;
  24.       __asm__("f2xm1" : "=t" (x) : "0" (x));
  25.       return x;
  26.     }
  27.   else
  28.     return expl(x) - 1.0L;
  29. }
  30.