blob: e8baaf4fa8a20a264901ef80ccb0746ecc47ca37 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/* sinhf.c
*
* Hyperbolic sine
*
*
*
* SYNOPSIS:
*
* float x, y, sinhf();
*
* y = sinhf( x );
*
*
*
* DESCRIPTION:
*
* Returns hyperbolic sine of argument in the range MINLOGF to
* MAXLOGF.
*
* The range is partitioned into two segments. If |x| <= 1, a
* polynomial approximation is used.
* Otherwise the calculation is sinh(x) = ( exp(x) - exp(-x) )/2.
*
*
*
* ACCURACY:
*
* Relative error:
* arithmetic domain # trials peak rms
* IEEE +-MAXLOG 100000 1.1e-7 2.9e-8
*
*/
/*
Cephes Math Library Release 2.2: June, 1992
Copyright 1984, 1987, 1989, 1992 by Stephen L. Moshier
Direct inquiries to 30 Frost Street, Cambridge, MA 02140
*/
/* Single precision hyperbolic sine
* test interval: [-1, +1]
* trials: 10000
* peak relative error: 9.0e-8
* rms relative error: 3.0e-8
*/
#include <math.h>
extern float MAXLOGF, MAXNUMF;
float expf( float );
float sinhf( float xx )
{
register float z;
float x;
x = xx;
if( xx < 0 )
z = -x;
else
z = x;
if( z > MAXLOGF )
{
mtherr( "sinhf", DOMAIN );
if( x > 0 )
return( MAXNUMF );
else
return( -MAXNUMF );
}
if( z > 1.0 )
{
z = expf(z);
z = 0.5*z - (0.5/z);
if( x < 0 )
z = -z;
}
else
{
z = x * x;
z =
(( 2.03721912945E-4 * z
+ 8.33028376239E-3) * z
+ 1.66667160211E-1) * z * x
+ x;
}
return( z );
}
|