Coverage Report

Created: 2025-06-13 06:17

/src/moddable/xs/tools/fdlibm/e_acosh.c
Line
Count
Source
1
2
/*
3
 * ====================================================
4
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5
 *
6
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
7
 * Permission to use, copy, modify, and distribute this
8
 * software is freely granted, provided that this notice 
9
 * is preserved.
10
 * ====================================================
11
 *
12
 */
13
14
/* acosh(x)
15
 * Method :
16
 *  Based on 
17
 *    acosh(x) = log [ x + sqrt(x*x-1) ]
18
 *  we have
19
 *    acosh(x) := log(x)+ln2, if x is large; else
20
 *    acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
21
 *    acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
22
 *
23
 * Special cases:
24
 *  acosh(x) is NaN with signal if x<1.
25
 *  acosh(NaN) is NaN without signal.
26
 */
27
28
#include "math_private.h"
29
30
static const double
31
one = 1.0,
32
ln2 = 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
33
34
double
35
__ieee754_acosh(double x)
36
267k
{
37
267k
  double t;
38
267k
  int32_t hx;
39
267k
  u_int32_t lx;
40
267k
  EXTRACT_WORDS(hx,lx,x);
41
267k
  if(hx<0x3ff00000) {   /* x < 1 */
42
20.9k
      return (x-x)/(x-x);
43
246k
  } else if(hx >=0x41b00000) { /* x > 2**28 */
44
6.01k
      if(hx >=0x7ff00000) { /* x is inf of NaN */
45
4.11k
          return x+x;
46
4.11k
      } else 
47
1.89k
    return __ieee754_log(x)+ln2; /* acosh(huge)=log(2x) */
48
240k
  } else if(((hx-0x3ff00000)|lx)==0) {
49
21.1k
      return 0.0;     /* acosh(1) = 0 */
50
219k
  } else if (hx > 0x40000000) { /* 2**28 > x > 2 */
51
195k
      t=x*x;
52
195k
      return __ieee754_log(2.0*x-one/(x+sqrt(t-one)));
53
195k
  } else {     /* 1<x<2 */
54
23.6k
      t = x-one;
55
23.6k
      return s_log1p(t+sqrt(2.0*t+t*t));
56
23.6k
  }
57
267k
}