22static double clenshaw(std::size_t
n,
const double* coeffs,
double x,
double left,
double right) {
26 double t = (2.*
x -
left -
right) / (right - left);
29 for(std::ptrdiff_t k =
n-1; k >= 1; k--) {
30 double b0 = coeffs[k] +
t2 *
b1 -
b2;
34 return 0.5 * coeffs[0] + t *
b1 -
b2 ;
38static const double fd_half_coeffs_1_1[] = {
39 1.7177138871306189157,
40 0.6192579515822668460,
41 0.0932802275119206269,
42 0.0047094853246636182,
43 -0.0004243667967864481,
44 -0.0000452569787686193,
65static const double fd_half_coeffs_1_4[] = {
69 -0.007730591500584980,
70 -0.000217443383867318,
72 -0.000021586361321527,
89static const double fd_half_coeffs_4_10[] = {
90 29.584339348839816528,
93 -0.021540694914550443,
95 -0.000257365680646579,
116static const double fd_half_coeffs_10_30[] = {
117 1.5116909434145508537,
118 -0.0036043405371630468,
119 0.0014207743256393359,
120 -0.0005045399052400260,
121 0.0001690758006957347,
122 -0.0000546305872688307,
123 0.0000172223228484571,
149#define WITH_SIZE(arr) sizeof(arr)/sizeof(double), arr
151static const double eta_table[] = {
152 0.50000000000000000000000000000,
154 0.82246703342411321823620758332,
155 0.90154267736969571404980362113,
156 0.94703282949724591757650323447,
157 0.97211977044690930593565514355,
158 0.98555109129743510409843924448,
159 0.99259381992283028267042571313,
160 0.99623300185264789922728926008,
161 0.99809429754160533076778303185,
162 0.99903950759827156563922184570,
163 0.99951714349806075414409417483,
164 0.99975768514385819085317967871,
165 0.99987854276326511549217499282,
166 0.99993917034597971817095419226,
167 0.99996955121309923808263293263,
168 0.99998476421490610644168277496,
169 0.99999237829204101197693787224,
170 0.99999618786961011347968922641,
171 0.99999809350817167510685649297,
172 0.99999904661158152211505084256,
173 0.99999952325821554281631666433,
174 0.99999976161323082254789720494,
175 0.99999988080131843950322382485,
176 0.99999994039889239462836140314,
177 0.99999997019885696283441513311,
178 0.99999998509923199656878766181,
179 0.99999999254955048496351585274,
180 0.99999999627475340010872752767,
181 0.99999999813736941811218674656,
182 0.99999999906868228145397862728,
183 0.99999999953434033145421751469,
184 0.99999999976716989595149082282,
185 0.99999999988358485804603047265,
186 0.99999999994179239904531592388,
187 0.99999999997089618952980952258,
188 0.99999999998544809143388476396,
189 0.99999999999272404460658475006,
190 0.99999999999636202193316875550,
191 0.99999999999818101084320873555,
192 0.99999999999909050538047887809,
193 0.99999999999954525267653087357,
194 0.99999999999977262633369589773,
195 0.99999999999988631316532476488,
196 0.99999999999994315658215465336,
197 0.99999999999997157829090808339,
198 0.99999999999998578914539762720,
199 0.99999999999999289457268000875,
200 0.99999999999999644728633373609,
201 0.99999999999999822364316477861,
202 0.99999999999999911182158169283,
203 0.99999999999999955591079061426,
204 0.99999999999999977795539522974,
205 0.99999999999999988897769758908,
206 0.99999999999999994448884878594,
207 0.99999999999999997224442439010,
208 0.99999999999999998612221219410,
209 0.99999999999999999306110609673,
210 0.99999999999999999653055304826,
211 0.99999999999999999826527652409,
212 0.99999999999999999913263826204,
213 0.99999999999999999956631913101,
214 0.99999999999999999978315956551,
215 0.99999999999999999989157978275,
216 0.99999999999999999994578989138,
217 0.99999999999999999997289494569,
218 0.99999999999999999998644747284,
219 0.99999999999999999999322373642,
220 0.99999999999999999999661186821,
221 0.99999999999999999999830593411,
222 0.99999999999999999999915296705,
223 0.99999999999999999999957648353,
224 0.99999999999999999999978824176,
225 0.99999999999999999999989412088,
226 0.99999999999999999999994706044,
227 0.99999999999999999999997353022,
228 0.99999999999999999999998676511,
229 0.99999999999999999999999338256,
230 0.99999999999999999999999669128,
231 0.99999999999999999999999834564,
232 0.99999999999999999999999917282,
233 0.99999999999999999999999958641,
234 0.99999999999999999999999979320,
235 0.99999999999999999999999989660,
236 0.99999999999999999999999994830,
237 0.99999999999999999999999997415,
238 0.99999999999999999999999998708,
239 0.99999999999999999999999999354,
240 0.99999999999999999999999999677,
241 0.99999999999999999999999999838,
242 0.99999999999999999999999999919,
243 0.99999999999999999999999999960,
244 0.99999999999999999999999999980,
245 0.99999999999999999999999999990,
246 0.99999999999999999999999999995,
247 0.99999999999999999999999999997,
248 0.99999999999999999999999999999,
249 0.99999999999999999999999999999,
250 1.00000000000000000000000000000,
251 1.00000000000000000000000000000,
252 1.00000000000000000000000000000,
262 for(
int n = 2;
n < 100 ;
n++) {
263 double rat = (
n - 1.) /
n;
266 if(
fabs(
term/
sum) < std::numeric_limits<double>::epsilon())
break;
271 return clenshaw(
WITH_SIZE(fd_half_coeffs_1_1), x, -1., 1.);
274 return clenshaw(
WITH_SIZE(fd_half_coeffs_1_4), x, 1., 4.);
277 return clenshaw(
WITH_SIZE(fd_half_coeffs_4_10), x, 4., 10.);
280 double val = clenshaw(
WITH_SIZE(fd_half_coeffs_10_30), x, 10., 30.);
281 return x *
sqrt(x) * val;
285 const int itmax = 200;
286 const double lg = 0.28468287047291918;
288 double xm2 = 1. /
x /
x;
290 double add = std::numeric_limits<double>::max();
294 const double eta = (
n <= 50)? eta_table[2*
n]: 1.;
298 if(
fabs(add/
seqn) < std::numeric_limits<double>::epsilon())
break;