1:
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
30:
31: #include "math.h"
32: #include "math_private.h"
33:
34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
68:
69: #define N 128
70:
71: 72: 73: 74: 75: 76: 77: 78: 79:
80: static const double A1 = .08333333333333178827;
81: static const double A2 = .01250000000377174923;
82: static const double A3 = .002232139987919447809;
83: static const double A4 = .0004348877777076145742;
84:
85: static const double logF_head[N+1] = {
86: 0.,
87: .007782140442060381246,
88: .015504186535963526694,
89: .023167059281547608406,
90: .030771658666765233647,
91: .038318864302141264488,
92: .045809536031242714670,
93: .053244514518837604555,
94: .060624621816486978786,
95: .067950661908525944454,
96: .075223421237524235039,
97: .082443669210988446138,
98: .089612158689760690322,
99: .096729626458454731618,
100: .103796793681567578460,
101: .110814366340264314203,
102: .117783035656430001836,
103: .124703478501032805070,
104: .131576357788617315236,
105: .138402322859292326029,
106: .145182009844575077295,
107: .151916042025732167530,
108: .158605030176659056451,
109: .165249572895390883786,
110: .171850256926518341060,
111: .178407657472689606947,
112: .184922338493834104156,
113: .191394852999565046047,
114: .197825743329758552135,
115: .204215541428766300668,
116: .210564769107350002741,
117: .216873938300523150246,
118: .223143551314024080056,
119: .229374101064877322642,
120: .235566071312860003672,
121: .241719936886966024758,
122: .247836163904594286577,
123: .253915209980732470285,
124: .259957524436686071567,
125: .265963548496984003577,
126: .271933715484010463114,
127: .277868451003087102435,
128: .283768173130738432519,
129: .289633292582948342896,
130: .295464212893421063199,
131: .301261330578199704177,
132: .307025035294827830512,
133: .312755710004239517729,
134: .318453731118097493890,
135: .324119468654316733591,
136: .329753286372579168528,
137: .335355541920762334484,
138: .340926586970454081892,
139: .346466767346100823488,
140: .351976423156884266063,
141: .357455888922231679316,
142: .362905493689140712376,
143: .368325561158599157352,
144: .373716409793814818840,
145: .379078352934811846353,
146: .384411698910298582632,
147: .389716751140440464951,
148: .394993808240542421117,
149: .400243164127459749579,
150: .405465108107819105498,
151: .410659924985338875558,
152: .415827895143593195825,
153: .420969294644237379543,
154: .426084395310681429691,
155: .431173464818130014464,
156: .436236766774527495726,
157: .441274560805140936281,
158: .446287102628048160113,
159: .451274644139630254358,
160: .456237433481874177232,
161: .461175715122408291790,
162: .466089729924533457960,
163: .470979715219073113985,
164: .475845904869856894947,
165: .480688529345570714212,
166: .485507815781602403149,
167: .490303988045525329653,
168: .495077266798034543171,
169: .499827869556611403822,
170: .504556010751912253908,
171: .509261901790523552335,
172: .513945751101346104405,
173: .518607764208354637958,
174: .523248143765158602036,
175: .527867089620485785417,
176: .532464798869114019908,
177: .537041465897345915436,
178: .541597282432121573947,
179: .546132437597407260909,
180: .550647117952394182793,
181: .555141507540611200965,
182: .559615787935399566777,
183: .564070138285387656651,
184: .568504735352689749561,
185: .572919753562018740922,
186: .577315365035246941260,
187: .581691739635061821900,
188: .586049045003164792433,
189: .590387446602107957005,
190: .594707107746216934174,
191: .599008189645246602594,
192: .603290851438941899687,
193: .607555250224322662688,
194: .611801541106615331955,
195: .616029877215623855590,
196: .620240409751204424537,
197: .624433288012369303032,
198: .628608659422752680256,
199: .632766669570628437213,
200: .636907462236194987781,
201: .641031179420679109171,
202: .645137961373620782978,
203: .649227946625615004450,
204: .653301272011958644725,
205: .657358072709030238911,
206: .661398482245203922502,
207: .665422632544505177065,
208: .669430653942981734871,
209: .673422675212350441142,
210: .677398823590920073911,
211: .681359224807238206267,
212: .685304003098281100392,
213: .689233281238557538017,
214: .693147180560117703862
215: };
216:
217: static const double logF_tail[N+1] = {
218: 0.,
219: -.00000000000000543229938420049,
220: .00000000000000172745674997061,
221: -.00000000000001323017818229233,
222: -.00000000000001154527628289872,
223: -.00000000000000466529469958300,
224: .00000000000005148849572685810,
225: -.00000000000002532168943117445,
226: -.00000000000005213620639136504,
227: -.00000000000001819506003016881,
228: .00000000000006329065958724544,
229: .00000000000008614512936087814,
230: -.00000000000007355770219435028,
231: .00000000000009638067658552277,
232: .00000000000007598636597194141,
233: .00000000000002579999128306990,
234: -.00000000000004654729747598444,
235: -.00000000000007556920687451336,
236: .00000000000010195735223708472,
237: -.00000000000017319034406422306,
238: -.00000000000007718001336828098,
239: .00000000000010980754099855238,
240: -.00000000000002047235780046195,
241: -.00000000000008372091099235912,
242: .00000000000014088127937111135,
243: .00000000000012869017157588257,
244: .00000000000017788850778198106,
245: .00000000000006440856150696891,
246: .00000000000016132822667240822,
247: -.00000000000007540916511956188,
248: -.00000000000000036507188831790,
249: .00000000000009120937249914984,
250: .00000000000018567570959796010,
251: -.00000000000003149265065191483,
252: -.00000000000009309459495196889,
253: .00000000000017914338601329117,
254: -.00000000000001302979717330866,
255: .00000000000023097385217586939,
256: .00000000000023999540484211737,
257: .00000000000015393776174455408,
258: -.00000000000036870428315837678,
259: .00000000000036920375082080089,
260: -.00000000000009383417223663699,
261: .00000000000009433398189512690,
262: .00000000000041481318704258568,
263: -.00000000000003792316480209314,
264: .00000000000008403156304792424,
265: -.00000000000034262934348285429,
266: .00000000000043712191957429145,
267: -.00000000000010475750058776541,
268: -.00000000000011118671389559323,
269: .00000000000037549577257259853,
270: .00000000000013912841212197565,
271: .00000000000010775743037572640,
272: .00000000000029391859187648000,
273: -.00000000000042790509060060774,
274: .00000000000022774076114039555,
275: .00000000000010849569622967912,
276: -.00000000000023073801945705758,
277: .00000000000015761203773969435,
278: .00000000000003345710269544082,
279: -.00000000000041525158063436123,
280: .00000000000032655698896907146,
281: -.00000000000044704265010452446,
282: .00000000000034527647952039772,
283: -.00000000000007048962392109746,
284: .00000000000011776978751369214,
285: -.00000000000010774341461609578,
286: .00000000000021863343293215910,
287: .00000000000024132639491333131,
288: .00000000000039057462209830700,
289: -.00000000000026570679203560751,
290: .00000000000037135141919592021,
291: -.00000000000017166921336082431,
292: -.00000000000028658285157914353,
293: -.00000000000023812542263446809,
294: .00000000000006576659768580062,
295: -.00000000000028210143846181267,
296: .00000000000010701931762114254,
297: .00000000000018119346366441110,
298: .00000000000009840465278232627,
299: -.00000000000033149150282752542,
300: -.00000000000018302857356041668,
301: -.00000000000016207400156744949,
302: .00000000000048303314949553201,
303: -.00000000000071560553172382115,
304: .00000000000088821239518571855,
305: -.00000000000030900580513238244,
306: -.00000000000061076551972851496,
307: .00000000000035659969663347830,
308: .00000000000035782396591276383,
309: -.00000000000046226087001544578,
310: .00000000000062279762917225156,
311: .00000000000072838947272065741,
312: .00000000000026809646615211673,
313: -.00000000000010960825046059278,
314: .00000000000002311949383800537,
315: -.00000000000058469058005299247,
316: -.00000000000002103748251144494,
317: -.00000000000023323182945587408,
318: -.00000000000042333694288141916,
319: -.00000000000043933937969737844,
320: .00000000000041341647073835565,
321: .00000000000006841763641591466,
322: .00000000000047585534004430641,
323: .00000000000083679678674757695,
324: -.00000000000085763734646658640,
325: .00000000000021913281229340092,
326: -.00000000000062242842536431148,
327: -.00000000000010983594325438430,
328: .00000000000065310431377633651,
329: -.00000000000047580199021710769,
330: -.00000000000037854251265457040,
331: .00000000000040939233218678664,
332: .00000000000087424383914858291,
333: .00000000000025218188456842882,
334: -.00000000000003608131360422557,
335: -.00000000000050518555924280902,
336: .00000000000078699403323355317,
337: -.00000000000067020876961949060,
338: .00000000000016108575753932458,
339: .00000000000058527188436251509,
340: -.00000000000035246757297904791,
341: -.00000000000018372084495629058,
342: .00000000000088606689813494916,
343: .00000000000066486268071468700,
344: .00000000000063831615170646519,
345: .00000000000025144230728376072,
346: -.00000000000017239444525614834
347: };
348:
349: 350: 351: 352:
353: struct Double
354: __log__D(double x)
355: {
356: int m, j;
357: double F, f, g, q, u, v, u2;
358: volatile double u1;
359: struct Double r;
360:
361:
362:
363:
364: m = logb(x);
365: g = ldexp(x, -m);
366: if (m == -1022) {
367: j = logb(g);
368: m += j;
369: g = ldexp(g, -j);
370: }
371: j = N*(g-1) + .5;
372: F = (1.0/N) * j + 1;
373: f = g - F;
374:
375: g = 1/(2*F+f);
376: u = 2*f*g;
377: v = u*u;
378: q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
379: if (m | j) {
380: u1 = u + 513;
381: u1 -= 513;
382: }
383: else {
384: u1 = u;
385: TRUNC(u1);
386: }
387: u2 = (2.0*(f - F*u1) - u1*f) * g;
388:
389: u1 += m*logF_head[N] + logF_head[j];
390:
391: u2 += logF_tail[j]; u2 += q;
392: u2 += logF_tail[N]*m;
393: r.a = u1 + u2;
394: TRUNC(r.a);
395: r.b = (u1 - r.a) + u2;
396: return (r);
397: }