annotate packages/language/c/libm/current/src/complex/cephes_subrf.c @ 3260:77f9d3253c3e

Add: Complex number header and library (single and double precision floating point), port from Newlib. Add: Single precision floating point library, port from Newlib. [ Bugzilla 1001539 ]
author vae
date Sun, 25 Aug 2013 14:38:57 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3260
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
1 /* $NetBSD: cephes_subrf.c,v 1.1 2007/08/20 16:01:34 drochner Exp $ */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
2
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
3 /*-
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
4 * Copyright (c) 2007 The NetBSD Foundation, Inc.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
5 * All rights reserved.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
6 *
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
7 * This code is derived from software written by Stephen L. Moshier.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
8 * It is redistributed by the NetBSD Foundation by permission of the author.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
9 *
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
10 * Redistribution and use in source and binary forms, with or without
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
11 * modification, are permitted provided that the following conditions
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
12 * are met:
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
13 * 1. Redistributions of source code must retain the above copyright
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
14 * notice, this list of conditions and the following disclaimer.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
15 * 2. Redistributions in binary form must reproduce the above copyright
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
16 * notice, this list of conditions and the following disclaimer in the
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
17 * documentation and/or other materials provided with the distribution.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
18 *
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
29 * POSSIBILITY OF SUCH DAMAGE.
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
30 *
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
31 * imported and modified include for newlib 2010/10/03
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
32 * Marco Atzeri <marco_atzeri@yahoo.it>
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
33 */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
34
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
35 #include <complex.h>
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
36 #include <math.h>
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
37 #include "cephes_subrf.h"
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
38
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
39 /* calculate cosh and sinh */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
40
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
41 void
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
42 _cchshf(float x, float *c, float *s)
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
43 {
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
44 float e, ei;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
45
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
46 if (fabsf(x) <= 0.5f) {
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
47 *c = coshf(x);
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
48 *s = sinhf(x);
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
49 } else {
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
50 e = expf(x);
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
51 ei = 0.5f / e;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
52 e = 0.5f * e;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
53 *s = e - ei;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
54 *c = e + ei;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
55 }
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
56 }
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
57
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
58 /* Program to subtract nearest integer multiple of PI */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
59
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
60 /* extended precision value of PI: */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
61 static const double DP1 = 3.140625;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
62 static const double DP2 = 9.67502593994140625E-4;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
63 static const double DP3 = 1.509957990978376432E-7;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
64 #define MACHEPF 3.0e-8
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
65
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
66 float
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
67 _redupif(float x)
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
68 {
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
69 float t;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
70 long i;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
71
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
72 t = x / (float)M_PI;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
73 if (t >= 0.0f)
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
74 t += 0.5f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
75 else
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
76 t -= 0.5f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
77
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
78 i = t; /* the multiple */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
79 t = i;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
80 t = ((x - t * DP1) - t * DP2) - t * DP3;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
81 return t;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
82 }
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
83
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
84 /* Taylor series expansion for cosh(2y) - cos(2x) */
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
85
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
86 float
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
87 _ctansf(float complex z)
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
88 {
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
89 float f, x, x2, y, y2, rn, t, d;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
90
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
91 x = fabsf(2.0f * crealf(z));
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
92 y = fabsf(2.0f * cimagf(z));
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
93
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
94 x = _redupif(x);
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
95
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
96 x = x * x;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
97 y = y * y;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
98 x2 = 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
99 y2 = 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
100 f = 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
101 rn = 0.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
102 d = 0.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
103 do {
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
104 rn += 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
105 f *= rn;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
106 rn += 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
107 f *= rn;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
108 x2 *= x;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
109 y2 *= y;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
110 t = y2 + x2;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
111 t /= f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
112 d += t;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
113
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
114 rn += 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
115 f *= rn;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
116 rn += 1.0f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
117 f *= rn;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
118 x2 *= x;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
119 y2 *= y;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
120 t = y2 - x2;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
121 t /= f;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
122 d += t;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
123 } while (fabsf(t/d) > MACHEPF);
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
124 return d;
77f9d3253c3e Add: Complex number header and library (single and double precision floating point),
vae
parents:
diff changeset
125 }