Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4349 Serge 1
/* ef_cosh.c -- float version of e_cosh.c.
2
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3
 */
4
 
5
/*
6
 * ====================================================
7
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8
 *
9
 * Developed at SunPro, a Sun Microsystems, Inc. business.
10
 * Permission to use, copy, modify, and distribute this
11
 * software is freely granted, provided that this notice
12
 * is preserved.
13
 * ====================================================
14
 */
15
 
16
#include "fdlibm.h"
17
 
18
#ifdef __v810__
19
#define const
20
#endif
21
 
22
#ifdef __STDC__
23
static const float one = 1.0, half=0.5, huge = 1.0e30;
24
#else
25
static float one = 1.0, half=0.5, huge = 1.0e30;
26
#endif
27
 
28
#ifdef __STDC__
29
	float __ieee754_coshf(float x)
30
#else
31
	float __ieee754_coshf(x)
32
	float x;
33
#endif
34
{
35
	float t,w;
36
	__int32_t ix;
37
 
38
	GET_FLOAT_WORD(ix,x);
39
	ix &= 0x7fffffff;
40
 
41
    /* x is INF or NaN */
42
	if(!FLT_UWORD_IS_FINITE(ix)) return x*x;
43
 
44
    /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
45
	if(ix<0x3eb17218) {
46
	    t = expm1f(fabsf(x));
47
	    w = one+t;
48
	    if (ix<0x24000000) return w;	/* cosh(tiny) = 1 */
49
	    return one+(t*t)/(w+w);
50
	}
51
 
52
    /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
53
	if (ix < 0x41b00000) {
54
		t = __ieee754_expf(fabsf(x));
55
		return half*t+half/t;
56
	}
57
 
58
    /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
59
	if (ix <= FLT_UWORD_LOG_MAX)
60
	  return half*__ieee754_expf(fabsf(x));
61
 
62
    /* |x| in [log(maxdouble), overflowthresold] */
63
	if (ix <= FLT_UWORD_LOG_2MAX) {
64
	    w = __ieee754_expf(half*fabsf(x));
65
	    t = half*w;
66
	    return t*w;
67
	}
68
 
69
    /* |x| > overflowthresold, cosh(x) overflow */
70
	return huge*huge;
71
}