OSDN Git Service

Add MS7619SE
[uclinux-h8/uClinux-dist.git] / lib / libm / spence.c
1 /*                                                      spence.c
2  *
3  *      Dilogarithm
4  *
5  *
6  *
7  * SYNOPSIS:
8  *
9  * double x, y, spence();
10  *
11  * y = spence( x );
12  *
13  *
14  *
15  * DESCRIPTION:
16  *
17  * Computes the integral
18  *
19  *                    x
20  *                    -
21  *                   | | log t
22  * spence(x)  =  -   |   ----- dt
23  *                 | |   t - 1
24  *                  -
25  *                  1
26  *
27  * for x >= 0.  A rational approximation gives the integral in
28  * the interval (0.5, 1.5).  Transformation formulas for 1/x
29  * and 1-x are employed outside the basic expansion range.
30  *
31  *
32  *
33  * ACCURACY:
34  *
35  *                      Relative error:
36  * arithmetic   domain     # trials      peak         rms
37  *    IEEE      0,4         30000       3.9e-15     5.4e-16
38  *    DEC       0,4          3000       2.5e-16     4.5e-17
39  *
40  *
41  */
42 \f
43 /*                                                      spence.c */
44
45
46 /*
47 Cephes Math Library Release 2.8:  June, 2000
48 Copyright 1985, 1987, 1989, 2000 by Stephen L. Moshier
49 */
50
51 #include "mconf.h"
52
53 #ifdef UNK
54 static double A[8] = {
55   4.65128586073990045278E-5,
56   7.31589045238094711071E-3,
57   1.33847639578309018650E-1,
58   8.79691311754530315341E-1,
59   2.71149851196553469920E0,
60   4.25697156008121755724E0,
61   3.29771340985225106936E0,
62   1.00000000000000000126E0,
63 };
64 static double B[8] = {
65   6.90990488912553276999E-4,
66   2.54043763932544379113E-2,
67   2.82974860602568089943E-1,
68   1.41172597751831069617E0,
69   3.63800533345137075418E0,
70   5.03278880143316990390E0,
71   3.54771340985225096217E0,
72   9.99999999999999998740E-1,
73 };
74 #endif
75 #ifdef DEC
76 static unsigned short A[32] = {
77 0034503,0013315,0034120,0157771,
78 0036357,0135043,0016766,0150637,
79 0037411,0007533,0005212,0161475,
80 0040141,0031563,0023217,0120331,
81 0040455,0104461,0007002,0155522,
82 0040610,0034434,0065721,0120465,
83 0040523,0006674,0105671,0054427,
84 0040200,0000000,0000000,0000000,
85 };
86 static unsigned short B[32] = {
87 0035465,0021626,0032367,0144157,
88 0036720,0016326,0134431,0000406,
89 0037620,0161024,0133701,0120766,
90 0040264,0131557,0152055,0064512,
91 0040550,0152424,0051166,0034272,
92 0040641,0006233,0014672,0111572,
93 0040543,0006674,0105671,0054425,
94 0040200,0000000,0000000,0000000,
95 };
96 #endif
97 #ifdef IBMPC
98 static unsigned short A[32] = {
99 0x1bff,0xa70a,0x62d9,0x3f08,
100 0xda34,0x63be,0xf744,0x3f7d,
101 0x5c68,0x6151,0x21eb,0x3fc1,
102 0xf41b,0x64d1,0x266e,0x3fec,
103 0x5b6a,0x21c0,0xb126,0x4005,
104 0x3427,0x8d7a,0x0723,0x4011,
105 0x2b23,0x9177,0x61b7,0x400a,
106 0x0000,0x0000,0x0000,0x3ff0,
107 };
108 static unsigned short B[32] = {
109 0xf90e,0xc69e,0xa472,0x3f46,
110 0x2021,0xd723,0x039a,0x3f9a,
111 0x343f,0x96f8,0x1c42,0x3fd2,
112 0xad29,0xfa85,0x966d,0x3ff6,
113 0xc717,0x8a4e,0x1aa2,0x400d,
114 0x526f,0x6337,0x2193,0x4014,
115 0x2b23,0x9177,0x61b7,0x400c,
116 0x0000,0x0000,0x0000,0x3ff0,
117 };
118 #endif
119 #ifdef MIEEE
120 static unsigned short A[32] = {
121 0x3f08,0x62d9,0xa70a,0x1bff,
122 0x3f7d,0xf744,0x63be,0xda34,
123 0x3fc1,0x21eb,0x6151,0x5c68,
124 0x3fec,0x266e,0x64d1,0xf41b,
125 0x4005,0xb126,0x21c0,0x5b6a,
126 0x4011,0x0723,0x8d7a,0x3427,
127 0x400a,0x61b7,0x9177,0x2b23,
128 0x3ff0,0x0000,0x0000,0x0000,
129 };
130 static unsigned short B[32] = {
131 0x3f46,0xa472,0xc69e,0xf90e,
132 0x3f9a,0x039a,0xd723,0x2021,
133 0x3fd2,0x1c42,0x96f8,0x343f,
134 0x3ff6,0x966d,0xfa85,0xad29,
135 0x400d,0x1aa2,0x8a4e,0xc717,
136 0x4014,0x2193,0x6337,0x526f,
137 0x400c,0x61b7,0x9177,0x2b23,
138 0x3ff0,0x0000,0x0000,0x0000,
139 };
140 #endif
141
142 #ifdef ANSIPROT
143 extern double fabs ( double );
144 extern double log ( double );
145 extern double polevl ( double, void *, int );
146 #else
147 double fabs(), log(), polevl();
148 #endif
149 extern double PI, MACHEP;
150
151 double spence(x)
152 double x;
153 {
154 double w, y, z;
155 int flag;
156
157 if( x < 0.0 )
158         {
159         mtherr( "spence", DOMAIN );
160         return(0.0);
161         }
162
163 if( x == 1.0 )
164         return( 0.0 );
165
166 if( x == 0.0 )
167         return( PI*PI/6.0 );
168
169 flag = 0;
170
171 if( x > 2.0 )
172         {
173         x = 1.0/x;
174         flag |= 2;
175         }
176
177 if( x > 1.5 )
178         {
179         w = (1.0/x) - 1.0;
180         flag |= 2;
181         }
182
183 else if( x < 0.5 )
184         {
185         w = -x;
186         flag |= 1;
187         }
188
189 else
190         w = x - 1.0;
191
192
193 y = -w * polevl( w, A, 7) / polevl( w, B, 7 );
194
195 if( flag & 1 )
196         y = (PI * PI)/6.0  - log(x) * log(1.0-x) - y;
197
198 if( flag & 2 )
199         {
200         z = log(x);
201         y = -0.5 * z * z  -  y;
202         }
203
204 return( y );
205 }