annotate src/libm/k_rem_pio2.c @ 3294:470d0a416aa7

Fixed bug #714 fuzzyTew@gmail.com 2009-03-14 15:18:45 PDT patch to change HAVE_ICONV to HAVE_ICONV_H There are two separate iconv checks in configure -- one for the header file and one for the library. include/SDL_stdinc.h uses the library define to see whether or not it should reference the types defined in the header, which naturally breaks if the library exists and the header does not.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 21 Sep 2009 11:04:01 +0000
parents dc1eb82ffdaa
children
rev   line source
2757
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
1 /* @(#)k_rem_pio2.c 5.1 93/09/24 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
2 /*
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
3 * ====================================================
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
4 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
5 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
6 * Developed at SunPro, a Sun Microsystems, Inc. business.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
7 * Permission to use, copy, modify, and distribute this
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
8 * software is freely granted, provided that this notice
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
9 * is preserved.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
10 * ====================================================
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
11 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
12
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
13 #if defined(LIBM_SCCS) && !defined(lint)
3162
dc1eb82ffdaa Von: Thomas Zimmermann
Sam Lantinga <slouken@libsdl.org>
parents: 2757
diff changeset
14 static const char rcsid[] =
2757
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
15 "$NetBSD: k_rem_pio2.c,v 1.7 1995/05/10 20:46:25 jtc Exp $";
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
16 #endif
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
17
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
18 /*
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
19 * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
20 * double x[],y[]; int e0,nx,prec; int ipio2[];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
21 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
22 * __kernel_rem_pio2 return the last three digits of N with
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
23 * y = x - N*pi/2
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
24 * so that |y| < pi/2.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
25 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
26 * The method is to compute the integer (mod 8) and fraction parts of
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
27 * (2/pi)*x without doing the full multiplication. In general we
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
28 * skip the part of the product that are known to be a huge integer (
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
29 * more accurately, = 0 mod 8 ). Thus the number of operations are
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
30 * independent of the exponent of the input.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
31 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
32 * (2/pi) is represented by an array of 24-bit integers in ipio2[].
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
33 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
34 * Input parameters:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
35 * x[] The input value (must be positive) is broken into nx
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
36 * pieces of 24-bit integers in double precision format.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
37 * x[i] will be the i-th 24 bit of x. The scaled exponent
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
38 * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
39 * match x's up to 24 bits.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
40 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
41 * Example of breaking a double positive z into x[0]+x[1]+x[2]:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
42 * e0 = ilogb(z)-23
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
43 * z = scalbn(z,-e0)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
44 * for i = 0,1,2
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
45 * x[i] = floor(z)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
46 * z = (z-x[i])*2**24
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
47 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
48 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
49 * y[] ouput result in an array of double precision numbers.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
50 * The dimension of y[] is:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
51 * 24-bit precision 1
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
52 * 53-bit precision 2
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
53 * 64-bit precision 2
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
54 * 113-bit precision 3
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
55 * The actual value is the sum of them. Thus for 113-bit
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
56 * precison, one may have to do something like:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
57 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
58 * long double t,w,r_head, r_tail;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
59 * t = (long double)y[2] + (long double)y[1];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
60 * w = (long double)y[0];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
61 * r_head = t+w;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
62 * r_tail = w - (r_head - t);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
63 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
64 * e0 The exponent of x[0]
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
65 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
66 * nx dimension of x[]
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
67 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
68 * prec an integer indicating the precision:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
69 * 0 24 bits (single)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
70 * 1 53 bits (double)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
71 * 2 64 bits (extended)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
72 * 3 113 bits (quad)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
73 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
74 * ipio2[]
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
75 * integer array, contains the (24*i)-th to (24*i+23)-th
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
76 * bit of 2/pi after binary point. The corresponding
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
77 * floating value is
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
78 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
79 * ipio2[i] * 2^(-24(i+1)).
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
80 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
81 * External function:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
82 * double scalbn(), floor();
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
83 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
84 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
85 * Here is the description of some local variables:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
86 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
87 * jk jk+1 is the initial number of terms of ipio2[] needed
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
88 * in the computation. The recommended value is 2,3,4,
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
89 * 6 for single, double, extended,and quad.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
90 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
91 * jz local integer variable indicating the number of
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
92 * terms of ipio2[] used.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
93 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
94 * jx nx - 1
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
95 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
96 * jv index for pointing to the suitable ipio2[] for the
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
97 * computation. In general, we want
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
98 * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
99 * is an integer. Thus
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
100 * e0-3-24*jv >= 0 or (e0-3)/24 >= jv
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
101 * Hence jv = max(0,(e0-3)/24).
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
102 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
103 * jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
104 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
105 * q[] double array with integral value, representing the
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
106 * 24-bits chunk of the product of x and 2/pi.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
107 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
108 * q0 the corresponding exponent of q[0]. Note that the
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
109 * exponent for q[i] would be q0-24*i.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
110 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
111 * PIo2[] double precision array, obtained by cutting pi/2
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
112 * into 24 bits chunks.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
113 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
114 * f[] ipio2[] in floating point
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
115 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
116 * iq[] integer array by breaking up q[] in 24-bits chunk.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
117 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
118 * fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
119 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
120 * ih integer. If >0 it indicates q[] is >= 0.5, hence
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
121 * it also indicates the *sign* of the result.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
122 *
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
123 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
124
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
125
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
126 /*
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
127 * Constants:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
128 * The hexadecimal values are the intended ones for the following
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
129 * constants. The decimal values may be used, provided that the
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
130 * compiler will convert from decimal to binary accurately enough
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
131 * to produce the hexadecimal values shown.
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
132 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
133
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
134 #include "math.h"
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
135 #include "math_private.h"
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
136
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
137 libm_hidden_proto(scalbn)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
138 libm_hidden_proto(floor)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
139 #ifdef __STDC__
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
140 static const int init_jk[] = { 2, 3, 4, 6 }; /* initial value for jk */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
141 #else
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
142 static int init_jk[] = { 2, 3, 4, 6 };
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
143 #endif
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
144
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
145 #ifdef __STDC__
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
146 static const double PIo2[] = {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
147 #else
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
148 static double PIo2[] = {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
149 #endif
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
150 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
151 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
152 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
153 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
154 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
155 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
156 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
157 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
158 };
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
159
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
160 #ifdef __STDC__
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
161 static const double
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
162 #else
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
163 static double
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
164 #endif
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
165 zero = 0.0, one = 1.0, two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
166 twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
167
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
168 #ifdef __STDC__
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
169 int attribute_hidden
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
170 __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec,
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
171 const int32_t * ipio2)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
172 #else
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
173 int attribute_hidden
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
174 __kernel_rem_pio2(x, y, e0, nx, prec, ipio2)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
175 double x[], y[];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
176 int e0, nx, prec;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
177 int32_t ipio2[];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
178 #endif
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
179 {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
180 int32_t jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
181 double z, fw, f[20], fq[20], q[20];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
182
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
183 /* initialize jk */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
184 jk = init_jk[prec];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
185 jp = jk;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
186
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
187 /* determine jx,jv,q0, note that 3>q0 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
188 jx = nx - 1;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
189 jv = (e0 - 3) / 24;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
190 if (jv < 0)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
191 jv = 0;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
192 q0 = e0 - 24 * (jv + 1);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
193
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
194 /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
195 j = jv - jx;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
196 m = jx + jk;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
197 for (i = 0; i <= m; i++, j++)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
198 f[i] = (j < 0) ? zero : (double) ipio2[j];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
199
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
200 /* compute q[0],q[1],...q[jk] */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
201 for (i = 0; i <= jk; i++) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
202 for (j = 0, fw = 0.0; j <= jx; j++)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
203 fw += x[j] * f[jx + i - j];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
204 q[i] = fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
205 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
206
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
207 jz = jk;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
208 recompute:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
209 /* distill q[] into iq[] reversingly */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
210 for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
211 fw = (double) ((int32_t) (twon24 * z));
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
212 iq[i] = (int32_t) (z - two24 * fw);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
213 z = q[j - 1] + fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
214 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
215
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
216 /* compute n */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
217 z = scalbn(z, q0); /* actual value of z */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
218 z -= 8.0 * floor(z * 0.125); /* trim off integer >= 8 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
219 n = (int32_t) z;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
220 z -= (double) n;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
221 ih = 0;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
222 if (q0 > 0) { /* need iq[jz-1] to determine n */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
223 i = (iq[jz - 1] >> (24 - q0));
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
224 n += i;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
225 iq[jz - 1] -= i << (24 - q0);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
226 ih = iq[jz - 1] >> (23 - q0);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
227 } else if (q0 == 0)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
228 ih = iq[jz - 1] >> 23;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
229 else if (z >= 0.5)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
230 ih = 2;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
231
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
232 if (ih > 0) { /* q > 0.5 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
233 n += 1;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
234 carry = 0;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
235 for (i = 0; i < jz; i++) { /* compute 1-q */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
236 j = iq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
237 if (carry == 0) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
238 if (j != 0) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
239 carry = 1;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
240 iq[i] = 0x1000000 - j;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
241 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
242 } else
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
243 iq[i] = 0xffffff - j;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
244 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
245 if (q0 > 0) { /* rare case: chance is 1 in 12 */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
246 switch (q0) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
247 case 1:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
248 iq[jz - 1] &= 0x7fffff;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
249 break;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
250 case 2:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
251 iq[jz - 1] &= 0x3fffff;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
252 break;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
253 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
254 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
255 if (ih == 2) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
256 z = one - z;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
257 if (carry != 0)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
258 z -= scalbn(one, q0);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
259 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
260 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
261
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
262 /* check if recomputation is needed */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
263 if (z == zero) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
264 j = 0;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
265 for (i = jz - 1; i >= jk; i--)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
266 j |= iq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
267 if (j == 0) { /* need recomputation */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
268 for (k = 1; iq[jk - k] == 0; k++); /* k = no. of terms needed */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
269
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
270 for (i = jz + 1; i <= jz + k; i++) { /* add q[jz+1] to q[jz+k] */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
271 f[jx + i] = (double) ipio2[jv + i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
272 for (j = 0, fw = 0.0; j <= jx; j++)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
273 fw += x[j] * f[jx + i - j];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
274 q[i] = fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
275 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
276 jz += k;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
277 goto recompute;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
278 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
279 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
280
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
281 /* chop off zero terms */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
282 if (z == 0.0) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
283 jz -= 1;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
284 q0 -= 24;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
285 while (iq[jz] == 0) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
286 jz--;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
287 q0 -= 24;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
288 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
289 } else { /* break z into 24-bit if necessary */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
290 z = scalbn(z, -q0);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
291 if (z >= two24) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
292 fw = (double) ((int32_t) (twon24 * z));
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
293 iq[jz] = (int32_t) (z - two24 * fw);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
294 jz += 1;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
295 q0 += 24;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
296 iq[jz] = (int32_t) fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
297 } else
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
298 iq[jz] = (int32_t) z;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
299 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
300
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
301 /* convert integer "bit" chunk to floating-point value */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
302 fw = scalbn(one, q0);
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
303 for (i = jz; i >= 0; i--) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
304 q[i] = fw * (double) iq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
305 fw *= twon24;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
306 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
307
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
308 /* compute PIo2[0,...,jp]*q[jz,...,0] */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
309 for (i = jz; i >= 0; i--) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
310 for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
311 fw += PIo2[k] * q[i + k];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
312 fq[jz - i] = fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
313 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
314
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
315 /* compress fq[] into y[] */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
316 switch (prec) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
317 case 0:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
318 fw = 0.0;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
319 for (i = jz; i >= 0; i--)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
320 fw += fq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
321 y[0] = (ih == 0) ? fw : -fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
322 break;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
323 case 1:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
324 case 2:
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
325 fw = 0.0;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
326 for (i = jz; i >= 0; i--)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
327 fw += fq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
328 y[0] = (ih == 0) ? fw : -fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
329 fw = fq[0] - fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
330 for (i = 1; i <= jz; i++)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
331 fw += fq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
332 y[1] = (ih == 0) ? fw : -fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
333 break;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
334 case 3: /* painful */
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
335 for (i = jz; i > 0; i--) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
336 fw = fq[i - 1] + fq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
337 fq[i] += fq[i - 1] - fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
338 fq[i - 1] = fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
339 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
340 for (i = jz; i > 1; i--) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
341 fw = fq[i - 1] + fq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
342 fq[i] += fq[i - 1] - fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
343 fq[i - 1] = fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
344 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
345 for (fw = 0.0, i = jz; i >= 2; i--)
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
346 fw += fq[i];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
347 if (ih == 0) {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
348 y[0] = fq[0];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
349 y[1] = fq[1];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
350 y[2] = fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
351 } else {
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
352 y[0] = -fq[0];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
353 y[1] = -fq[1];
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
354 y[2] = -fw;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
355 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
356 }
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
357 return n & 7;
0581f49c9294 Whoops, missed a file...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
358 }