OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libm/] [math/] [e_atanh.c] - Blame information for rev 40

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 lampret
 
2
/* @(#)e_atanh.c 5.1 93/09/24 */
3
/*
4
 * ====================================================
5
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6
 *
7
 * Developed at SunPro, a Sun Microsystems, Inc. business.
8
 * Permission to use, copy, modify, and distribute this
9
 * software is freely granted, provided that this notice
10
 * is preserved.
11
 * ====================================================
12
 *
13
 */
14
 
15
/* __ieee754_atanh(x)
16
 * Method :
17
 *    1.Reduced x to positive by atanh(-x) = -atanh(x)
18
 *    2.For x>=0.5
19
 *                  1              2x                          x
20
 *      atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
21
 *                  2             1 - x                      1 - x
22
 *
23
 *      For x<0.5
24
 *      atanh(x) = 0.5*log1p(2x+2x*x/(1-x))
25
 *
26
 * Special cases:
27
 *      atanh(x) is NaN if |x| > 1 with signal;
28
 *      atanh(NaN) is that NaN with no signal;
29
 *      atanh(+-1) is +-INF with signal.
30
 *
31
 */
32
 
33
#include "fdlibm.h"
34
 
35
#ifndef _DOUBLE_IS_32BITS
36
 
37
#ifdef __STDC__
38
static const double one = 1.0, huge = 1e300;
39
#else
40
static double one = 1.0, huge = 1e300;
41
#endif
42
 
43
#ifdef __STDC__
44
static const double zero = 0.0;
45
#else
46
static double zero = 0.0;
47
#endif
48
 
49
#ifdef __STDC__
50
        double __ieee754_atanh(double x)
51
#else
52
        double __ieee754_atanh(x)
53
        double x;
54
#endif
55
{
56
        double t;
57
        __int32_t hx,ix;
58
        __uint32_t lx;
59
        EXTRACT_WORDS(hx,lx,x);
60
        ix = hx&0x7fffffff;
61
        if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */
62
            return (x-x)/(x-x);
63
        if(ix==0x3ff00000)
64
            return x/zero;
65
        if(ix<0x3e300000&&(huge+x)>zero) return x;      /* x<2**-28 */
66
        SET_HIGH_WORD(x,ix);
67
        if(ix<0x3fe00000) {             /* x < 0.5 */
68
            t = x+x;
69
            t = 0.5*log1p(t+t*x/(one-x));
70
        } else
71
            t = 0.5*log1p((x+x)/(one-x));
72
        if(hx>=0) return t; else return -t;
73
}
74
 
75
#endif /* defined(_DOUBLE_IS_32BITS) */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.