xref: /relibc/openlibm/bsdsrc/b_log.c (revision 73efb7903236482d1c254567c50f20ef14d90592)
1 /*
2  * Copyright (c) 1992, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 /* @(#)log.c	8.2 (Berkeley) 11/30/93 */
31 #include "cdefs-compat.h"
32 //__FBSDID("$FreeBSD: src/lib/msun/bsdsrc/b_log.c,v 1.9 2008/02/22 02:26:51 das Exp $");
33 
34 #include <openlibm.h>
35 #include <errno.h>
36 
37 #include "mathimpl.h"
38 
39 /* Table-driven natural logarithm.
40  *
41  * This code was derived, with minor modifications, from:
42  *	Peter Tang, "Table-Driven Implementation of the
43  *	Logarithm in IEEE Floating-Point arithmetic." ACM Trans.
44  *	Math Software, vol 16. no 4, pp 378-400, Dec 1990).
45  *
46  * Calculates log(2^m*F*(1+f/F)), |f/j| <= 1/256,
47  * where F = j/128 for j an integer in [0, 128].
48  *
49  * log(2^m) = log2_hi*m + log2_tail*m
50  * since m is an integer, the dominant term is exact.
51  * m has at most 10 digits (for subnormal numbers),
52  * and log2_hi has 11 trailing zero bits.
53  *
54  * log(F) = logF_hi[j] + logF_lo[j] is in tabular form in log_table.h
55  * logF_hi[] + 512 is exact.
56  *
57  * log(1+f/F) = 2*f/(2*F + f) + 1/12 * (2*f/(2*F + f))**3 + ...
58  * the leading term is calculated to extra precision in two
59  * parts, the larger of which adds exactly to the dominant
60  * m and F terms.
61  * There are two cases:
62  *	1. when m, j are non-zero (m | j), use absolute
63  *	   precision for the leading term.
64  *	2. when m = j = 0, |1-x| < 1/256, and log(x) ~= (x-1).
65  *	   In this case, use a relative precision of 24 bits.
66  * (This is done differently in the original paper)
67  *
68  * Special cases:
69  *	0	return signalling -Inf
70  *	neg	return signalling NaN
71  *	+Inf	return +Inf
72 */
73 
74 #define N 128
75 
76 /* Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128.
77  * Used for generation of extend precision logarithms.
78  * The constant 35184372088832 is 2^45, so the divide is exact.
79  * It ensures correct reading of logF_head, even for inaccurate
80  * decimal-to-binary conversion routines.  (Everybody gets the
81  * right answer for integers less than 2^53.)
82  * Values for log(F) were generated using error < 10^-57 absolute
83  * with the bc -l package.
84 */
85 static double	A1 = 	  .08333333333333178827;
86 static double	A2 = 	  .01250000000377174923;
87 static double	A3 =	 .002232139987919447809;
88 static double	A4 =	.0004348877777076145742;
89 
90 static double logF_head[N+1] = {
91 	0.,
92 	.007782140442060381246,
93 	.015504186535963526694,
94 	.023167059281547608406,
95 	.030771658666765233647,
96 	.038318864302141264488,
97 	.045809536031242714670,
98 	.053244514518837604555,
99 	.060624621816486978786,
100 	.067950661908525944454,
101 	.075223421237524235039,
102 	.082443669210988446138,
103 	.089612158689760690322,
104 	.096729626458454731618,
105 	.103796793681567578460,
106 	.110814366340264314203,
107 	.117783035656430001836,
108 	.124703478501032805070,
109 	.131576357788617315236,
110 	.138402322859292326029,
111 	.145182009844575077295,
112 	.151916042025732167530,
113 	.158605030176659056451,
114 	.165249572895390883786,
115 	.171850256926518341060,
116 	.178407657472689606947,
117 	.184922338493834104156,
118 	.191394852999565046047,
119 	.197825743329758552135,
120 	.204215541428766300668,
121 	.210564769107350002741,
122 	.216873938300523150246,
123 	.223143551314024080056,
124 	.229374101064877322642,
125 	.235566071312860003672,
126 	.241719936886966024758,
127 	.247836163904594286577,
128 	.253915209980732470285,
129 	.259957524436686071567,
130 	.265963548496984003577,
131 	.271933715484010463114,
132 	.277868451003087102435,
133 	.283768173130738432519,
134 	.289633292582948342896,
135 	.295464212893421063199,
136 	.301261330578199704177,
137 	.307025035294827830512,
138 	.312755710004239517729,
139 	.318453731118097493890,
140 	.324119468654316733591,
141 	.329753286372579168528,
142 	.335355541920762334484,
143 	.340926586970454081892,
144 	.346466767346100823488,
145 	.351976423156884266063,
146 	.357455888922231679316,
147 	.362905493689140712376,
148 	.368325561158599157352,
149 	.373716409793814818840,
150 	.379078352934811846353,
151 	.384411698910298582632,
152 	.389716751140440464951,
153 	.394993808240542421117,
154 	.400243164127459749579,
155 	.405465108107819105498,
156 	.410659924985338875558,
157 	.415827895143593195825,
158 	.420969294644237379543,
159 	.426084395310681429691,
160 	.431173464818130014464,
161 	.436236766774527495726,
162 	.441274560805140936281,
163 	.446287102628048160113,
164 	.451274644139630254358,
165 	.456237433481874177232,
166 	.461175715122408291790,
167 	.466089729924533457960,
168 	.470979715219073113985,
169 	.475845904869856894947,
170 	.480688529345570714212,
171 	.485507815781602403149,
172 	.490303988045525329653,
173 	.495077266798034543171,
174 	.499827869556611403822,
175 	.504556010751912253908,
176 	.509261901790523552335,
177 	.513945751101346104405,
178 	.518607764208354637958,
179 	.523248143765158602036,
180 	.527867089620485785417,
181 	.532464798869114019908,
182 	.537041465897345915436,
183 	.541597282432121573947,
184 	.546132437597407260909,
185 	.550647117952394182793,
186 	.555141507540611200965,
187 	.559615787935399566777,
188 	.564070138285387656651,
189 	.568504735352689749561,
190 	.572919753562018740922,
191 	.577315365035246941260,
192 	.581691739635061821900,
193 	.586049045003164792433,
194 	.590387446602107957005,
195 	.594707107746216934174,
196 	.599008189645246602594,
197 	.603290851438941899687,
198 	.607555250224322662688,
199 	.611801541106615331955,
200 	.616029877215623855590,
201 	.620240409751204424537,
202 	.624433288012369303032,
203 	.628608659422752680256,
204 	.632766669570628437213,
205 	.636907462236194987781,
206 	.641031179420679109171,
207 	.645137961373620782978,
208 	.649227946625615004450,
209 	.653301272011958644725,
210 	.657358072709030238911,
211 	.661398482245203922502,
212 	.665422632544505177065,
213 	.669430653942981734871,
214 	.673422675212350441142,
215 	.677398823590920073911,
216 	.681359224807238206267,
217 	.685304003098281100392,
218 	.689233281238557538017,
219 	.693147180560117703862
220 };
221 
222 static double logF_tail[N+1] = {
223 	0.,
224 	-.00000000000000543229938420049,
225 	 .00000000000000172745674997061,
226 	-.00000000000001323017818229233,
227 	-.00000000000001154527628289872,
228 	-.00000000000000466529469958300,
229 	 .00000000000005148849572685810,
230 	-.00000000000002532168943117445,
231 	-.00000000000005213620639136504,
232 	-.00000000000001819506003016881,
233 	 .00000000000006329065958724544,
234 	 .00000000000008614512936087814,
235 	-.00000000000007355770219435028,
236 	 .00000000000009638067658552277,
237 	 .00000000000007598636597194141,
238 	 .00000000000002579999128306990,
239 	-.00000000000004654729747598444,
240 	-.00000000000007556920687451336,
241 	 .00000000000010195735223708472,
242 	-.00000000000017319034406422306,
243 	-.00000000000007718001336828098,
244 	 .00000000000010980754099855238,
245 	-.00000000000002047235780046195,
246 	-.00000000000008372091099235912,
247 	 .00000000000014088127937111135,
248 	 .00000000000012869017157588257,
249 	 .00000000000017788850778198106,
250 	 .00000000000006440856150696891,
251 	 .00000000000016132822667240822,
252 	-.00000000000007540916511956188,
253 	-.00000000000000036507188831790,
254 	 .00000000000009120937249914984,
255 	 .00000000000018567570959796010,
256 	-.00000000000003149265065191483,
257 	-.00000000000009309459495196889,
258 	 .00000000000017914338601329117,
259 	-.00000000000001302979717330866,
260 	 .00000000000023097385217586939,
261 	 .00000000000023999540484211737,
262 	 .00000000000015393776174455408,
263 	-.00000000000036870428315837678,
264 	 .00000000000036920375082080089,
265 	-.00000000000009383417223663699,
266 	 .00000000000009433398189512690,
267 	 .00000000000041481318704258568,
268 	-.00000000000003792316480209314,
269 	 .00000000000008403156304792424,
270 	-.00000000000034262934348285429,
271 	 .00000000000043712191957429145,
272 	-.00000000000010475750058776541,
273 	-.00000000000011118671389559323,
274 	 .00000000000037549577257259853,
275 	 .00000000000013912841212197565,
276 	 .00000000000010775743037572640,
277 	 .00000000000029391859187648000,
278 	-.00000000000042790509060060774,
279 	 .00000000000022774076114039555,
280 	 .00000000000010849569622967912,
281 	-.00000000000023073801945705758,
282 	 .00000000000015761203773969435,
283 	 .00000000000003345710269544082,
284 	-.00000000000041525158063436123,
285 	 .00000000000032655698896907146,
286 	-.00000000000044704265010452446,
287 	 .00000000000034527647952039772,
288 	-.00000000000007048962392109746,
289 	 .00000000000011776978751369214,
290 	-.00000000000010774341461609578,
291 	 .00000000000021863343293215910,
292 	 .00000000000024132639491333131,
293 	 .00000000000039057462209830700,
294 	-.00000000000026570679203560751,
295 	 .00000000000037135141919592021,
296 	-.00000000000017166921336082431,
297 	-.00000000000028658285157914353,
298 	-.00000000000023812542263446809,
299 	 .00000000000006576659768580062,
300 	-.00000000000028210143846181267,
301 	 .00000000000010701931762114254,
302 	 .00000000000018119346366441110,
303 	 .00000000000009840465278232627,
304 	-.00000000000033149150282752542,
305 	-.00000000000018302857356041668,
306 	-.00000000000016207400156744949,
307 	 .00000000000048303314949553201,
308 	-.00000000000071560553172382115,
309 	 .00000000000088821239518571855,
310 	-.00000000000030900580513238244,
311 	-.00000000000061076551972851496,
312 	 .00000000000035659969663347830,
313 	 .00000000000035782396591276383,
314 	-.00000000000046226087001544578,
315 	 .00000000000062279762917225156,
316 	 .00000000000072838947272065741,
317 	 .00000000000026809646615211673,
318 	-.00000000000010960825046059278,
319 	 .00000000000002311949383800537,
320 	-.00000000000058469058005299247,
321 	-.00000000000002103748251144494,
322 	-.00000000000023323182945587408,
323 	-.00000000000042333694288141916,
324 	-.00000000000043933937969737844,
325 	 .00000000000041341647073835565,
326 	 .00000000000006841763641591466,
327 	 .00000000000047585534004430641,
328 	 .00000000000083679678674757695,
329 	-.00000000000085763734646658640,
330 	 .00000000000021913281229340092,
331 	-.00000000000062242842536431148,
332 	-.00000000000010983594325438430,
333 	 .00000000000065310431377633651,
334 	-.00000000000047580199021710769,
335 	-.00000000000037854251265457040,
336 	 .00000000000040939233218678664,
337 	 .00000000000087424383914858291,
338 	 .00000000000025218188456842882,
339 	-.00000000000003608131360422557,
340 	-.00000000000050518555924280902,
341 	 .00000000000078699403323355317,
342 	-.00000000000067020876961949060,
343 	 .00000000000016108575753932458,
344 	 .00000000000058527188436251509,
345 	-.00000000000035246757297904791,
346 	-.00000000000018372084495629058,
347 	 .00000000000088606689813494916,
348 	 .00000000000066486268071468700,
349 	 .00000000000063831615170646519,
350 	 .00000000000025144230728376072,
351 	-.00000000000017239444525614834
352 };
353 
354 #if 0
355 DLLEXPORT double
356 #ifdef _ANSI_SOURCE
357 log(double x)
358 #else
359 log(x) double x;
360 #endif
361 {
362 	int m, j;
363 	double F, f, g, q, u, u2, v, zero = 0.0, one = 1.0;
364 	volatile double u1;
365 
366 	/* Catch special cases */
367 	if (x <= 0)
368 		if (x == zero)	/* log(0) = -Inf */
369 			return (-one/zero);
370 		else		/* log(neg) = NaN */
371 			return (zero/zero);
372 	else if (!finite(x))
373 		return (x+x);		/* x = NaN, Inf */
374 
375 	/* Argument reduction: 1 <= g < 2; x/2^m = g;	*/
376 	/* y = F*(1 + f/F) for |f| <= 2^-8		*/
377 
378 	m = logb(x);
379 	g = ldexp(x, -m);
380 	if (m == -1022) {
381 		j = logb(g), m += j;
382 		g = ldexp(g, -j);
383 	}
384 	j = N*(g-1) + .5;
385 	F = (1.0/N) * j + 1;	/* F*128 is an integer in [128, 512] */
386 	f = g - F;
387 
388 	/* Approximate expansion for log(1+f/F) ~= u + q */
389 	g = 1/(2*F+f);
390 	u = 2*f*g;
391 	v = u*u;
392 	q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
393 
394     /* case 1: u1 = u rounded to 2^-43 absolute.  Since u < 2^-8,
395      * 	       u1 has at most 35 bits, and F*u1 is exact, as F has < 8 bits.
396      *         It also adds exactly to |m*log2_hi + log_F_head[j] | < 750
397     */
398 	if (m | j)
399 		u1 = u + 513, u1 -= 513;
400 
401     /* case 2:	|1-x| < 1/256. The m- and j- dependent terms are zero;
402      * 		u1 = u to 24 bits.
403     */
404 	else
405 		u1 = u, TRUNC(u1);
406 	u2 = (2.0*(f - F*u1) - u1*f) * g;
407 			/* u1 + u2 = 2f/(2F+f) to extra precision.	*/
408 
409 	/* log(x) = log(2^m*F*(1+f/F)) =				*/
410 	/* (m*log2_hi+logF_head[j]+u1) + (m*log2_lo+logF_tail[j]+q);	*/
411 	/* (exact) + (tiny)						*/
412 
413 	u1 += m*logF_head[N] + logF_head[j];		/* exact */
414 	u2 = (u2 + logF_tail[j]) + q;			/* tiny */
415 	u2 += logF_tail[N]*m;
416 	return (u1 + u2);
417 }
418 #endif
419 
420 /*
421  * Extra precision variant, returning struct {double a, b;};
422  * log(x) = a+b to 63 bits, with a rounded to 26 bits.
423  */
424 struct Double
425 #ifdef _ANSI_SOURCE
426 __log__D(double x)
427 #else
428 __log__D(x) double x;
429 #endif
430 {
431 	int m, j;
432 	double F, f, g, q, u, v, u2;
433 	volatile double u1;
434 	struct Double r;
435 
436 	/* Argument reduction: 1 <= g < 2; x/2^m = g;	*/
437 	/* y = F*(1 + f/F) for |f| <= 2^-8		*/
438 
439 	m = logb(x);
440 	g = ldexp(x, -m);
441 	if (m == -1022) {
442 		j = logb(g), m += j;
443 		g = ldexp(g, -j);
444 	}
445 	j = N*(g-1) + .5;
446 	F = (1.0/N) * j + 1;
447 	f = g - F;
448 
449 	g = 1/(2*F+f);
450 	u = 2*f*g;
451 	v = u*u;
452 	q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
453 	if (m | j)
454 		u1 = u + 513, u1 -= 513;
455 	else
456 		u1 = u, TRUNC(u1);
457 	u2 = (2.0*(f - F*u1) - u1*f) * g;
458 
459 	u1 += m*logF_head[N] + logF_head[j];
460 
461 	u2 +=  logF_tail[j]; u2 += q;
462 	u2 += logF_tail[N]*m;
463 	r.a = u1 + u2;			/* Only difference is here */
464 	TRUNC(r.a);
465 	r.b = (u1 - r.a) + u2;
466 	return (r);
467 }
468