/* @(#)e_acosh.c 5.1 93/09/24 */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

/* __ieee754_acosh(x)
 * Method :
 *	Based on
 *		acosh(x) = log [ x + sqrt(x*x-1) ]
 *	we have
 *		acosh(x) := log(x)+ln2,	if x is large; else
 *		acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
 *		acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
 *
 * Special cases:
 *	acosh(x) is NaN with signal if x<1.
 *	acosh(NaN) is NaN without signal.
 */

#include <math.h>
#include <math_private.h>

static const double
  one = 1.0,
  ln2 = 6.93147180559945286227e-01;    /* 0x3FE62E42, 0xFEFA39EF */

double
__ieee754_acosh (double x)
{
  double t;
  int32_t hx;
  uint32_t lx;
  EXTRACT_WORDS (hx, lx, x);
  if (hx < 0x3ff00000)                  /* x < 1 */
    {
      return (x - x) / (x - x);
    }
  else if (hx >= 0x41b00000)            /* x > 2**28 */
    {
      if (hx >= 0x7ff00000)             /* x is inf of NaN */
	{
	  return x + x;
	}
      else
	return __ieee754_log (x) + ln2;         /* acosh(huge)=log(2x) */
    }
  else if (((hx - 0x3ff00000) | lx) == 0)
    {
      return 0.0;                       /* acosh(1) = 0 */
    }
  else if (hx > 0x40000000)             /* 2**28 > x > 2 */
    {
      t = x * x;
      return __ieee754_log (2.0 * x - one / (x + __ieee754_sqrt (t - one)));
    }
  else                                  /* 1<x<2 */
    {
      t = x - one;
      return __log1p (t + __ieee754_sqrt (2.0 * t + t * t));
    }
}
strong_alias (__ieee754_acosh, __acosh_finite)
