Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4973 right-hear 1
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
2
/* e_atanhf.c -- float version of e_atanh.c.
3
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
4
 */
5
 
6
/*
7
 * ====================================================
8
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
9
 *
10
 * Developed at SunPro, a Sun Microsystems, Inc. business.
11
 * Permission to use, copy, modify, and distribute this
12
 * software is freely granted, provided that this notice
13
 * is preserved.
14
 * ====================================================
15
 */
16
 
17
#if defined(LIBM_SCCS) && !defined(lint)
18
static char rcsid[] = "$Id: e_atanhf.c,v 1.2 1994/08/18 23:05:14 jtc Exp $";
19
#endif
20
 
21
#include "math.h"
22
#include "math_private.h"
23
 
24
#ifdef __STDC__
25
static const float one = 1.0, huge = 1e30;
26
#else
27
static float one = 1.0, huge = 1e30;
28
#endif
29
 
30
#ifdef __STDC__
31
static const float zero = 0.0;
32
#else
33
static float zero = 0.0;
34
#endif
35
 
36
#ifdef __STDC__
37
	float __ieee754_atanhf(float x)
38
#else
39
	float __ieee754_atanhf(x)
40
	float x;
41
#endif
42
{
43
	float t;
44
	int32_t hx,ix;
45
	GET_FLOAT_WORD(hx,x);
46
	ix = hx&0x7fffffff;
47
	if (ix>0x3f800000) 		/* |x|>1 */
48
	    return (x-x)/(x-x);
49
	if(ix==0x3f800000)
50
	    return x/zero;
51
	if(ix<0x31800000&&(huge+x)>zero) return x;	/* x<2**-28 */
52
	SET_FLOAT_WORD(x,ix);
53
	if(ix<0x3f000000) {		/* x < 0.5 */
54
	    t = x+x;
55
	    t = (float)0.5*log1pf(t+t*x/(one-x));
56
	} else
57
	    t = (float)0.5*log1pf((x+x)/(one-x));
58
	if(hx>=0) return t; else return -t;
59
}