annotate src/libm/k_rem_pio2.c @ 5067:61d53410eb41

Fixed bug #859 CREATE_SUBDIRS helps a lot if browsing HTML documentation in a file browser. ALWAYS_DETAILED_SEC makes sure everything has at least the automatic documentation like function prototype and source references. STRIP_FROM_PATH allows you to include only the relevant portions of the files' paths, cleaning up both the file list and directory tree, though you need to change the path listed here to match wherever you put SDL. ALIASES avoids some warnings generated by C:\source\svn.libsdl.org\trunk\SDL\src\joystick\darwin\10.3.9-FIX\IOHIDLib.h. It seems Apple uses a few commands which are not normally supported by Doxygen. BUILTIN_STL_SUPPORT adds support for parsing code which makes use of the standard template library. There isn't a lot of C++ in SDL (some in bwindow at least), but this still seems like a good idea. TYPEDEF_HIDES_STRUCT means that for code like this: typedef struct A {int B;} C; C is documented as a structure containing B instead of a typedef mapped to A. EXTRACT_ALL, EXTRACT_PRIVATE, EXTRACT_STATIC, EXTRACT_LOCAL_METHODS, EXTRACT_ANON_NSPACES and INTERNAL_DOCS make sure that _everything_ is documented. CASE_SENSE_NAMES = NO avoids potential conflicts when building documentation on case insensitive file systems like NTFS and FAT32. WARN_NO_PARAMDOC lets you know when you have documented some, but not all, of the parameters of a function. This is useful when you're working on adding such documentation since it makes partially documented functions easier to spot. WARN_LOGFILE writes warnings to a seperate file instead of mixing them in with stdout. When not running in quiet mode, these warnings can be hard to spot without this flag. I added *.h.in and *.h.default to FILE_PATTERNS to generate documentation for config.h.in and config.h.default. RECURSIVE tells doxygen to look not only in the input directory, but also in subfolders. EXCLUDE avoids documenting things like test programs, examples and templates which need to be documented separately. I've used EXCLUDE_PATTERNS to exclude non-source subdirectories that often find their way into source folders (such as obj or .svn). EXAMPLE_PATH lists directories doxygen will search to find included example code. So far, SDL doesn't really use this feature, but I've listed some likely locations. SOURCE_BROWSER adds syntax highlighted source code to the HTML output. USE_HTAGS is nice, but not available on Windows. INLINE_SOURCES adds the body of a function to it's documentation so you can quickly see exactly what it does. ALPHABETICAL_INDEX generates an alphabetical list of all structures, functions, etc., which makes it much easier to find what you're looking for. IGNORE_PREFIX skips the SDL_ prefix when deciding which index page to place an item on so you don't have everything show up under "S". HTML_DYNAMIC_SECTIONS hides the includes/included by diagrams by default and adds JavaScript to allow the user to show and hide them by clicking a link. ENUM_VALUES_PER_LINE = 1 makes enums easier to read by placing each value on it's own line. GENERATE_TREEVIEW produces a two frame index page with a navigation tree on the left. I have LaTeX and man pages turned off to speed up doxygen, you may want to turn them back on yourself. I added _WIN32=1 to PREDEFINED to cause SDL to output documentation related to Win32 builds of SDL. Normally, doxygen gets confused since there are multiple definitions for various structures and formats that vary by platform. Without this doxygen can produce broken documentation or, if you're lucky, output documentation only for the dummy drivers, which isn't very useful. You need to pick a platform. GENERATE_TAGFILE produces a file which can be used to link other doxygen documentation to the SDL documentation. CLASS_DIAGRAMS turns on class diagrams even when dot is not available. HAVE_DOT tells doxygen to try to use dot to generate diagrams. TEMPLATE_RELATIONS and INCLUDE_GRAPH add additional diagrams to the documentation. DOT_MULTI_TARGETS speeds up dot. OUTPUT_DIRECTORY, INPUT and other paths reflect the fact that this Doxyfile is intended to process src as well as include and is being run from a separate subdirectory. Doxygen produces several temporary files while it's running and if interrupted, can leave those files behind. It's easier to clean up if there aren't a hundred or so files in the same folder. I typically run doxygen in SDL/doxy and set the output directory to '.'. Since doxygen puts it's output in subfolders by type, this keeps things pretty well organised. You could use '../doc' instead and get the same results.
author Sam Lantinga <slouken@libsdl.org>
date Fri, 21 Jan 2011 12:57:01 -0800
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 }