e_log10f.c revision 219361
12116Sjkh/* 22116Sjkh * ==================================================== 32116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 42116Sjkh * 52116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business. 62116Sjkh * Permission to use, copy, modify, and distribute this 78870Srgrimes * software is freely granted, provided that this notice 82116Sjkh * is preserved. 92116Sjkh * ==================================================== 102116Sjkh */ 112116Sjkh 12176451Sdas#include <sys/cdefs.h> 13176451Sdas__FBSDID("$FreeBSD: head/lib/msun/src/e_log10f.c 219361 2011-03-07 03:12:08Z das $"); 142116Sjkh 15219361Sdas/* 16219361Sdas * Return the base 10 logarithm of x. See k_log.c for details on the algorithm. 17219361Sdas */ 18219361Sdas 192116Sjkh#include "math.h" 202116Sjkh#include "math_private.h" 21219361Sdas#include "k_logf.h" 222116Sjkh 232116Sjkhstatic const float 242116Sjkhtwo25 = 3.3554432000e+07, /* 0x4c000000 */ 25219361Sdasivln10hi = 4.3432617188e-01, /* 0x3ede6000 */ 26219361Sdasivln10lo = -3.1689971365e-05, /* 0xb804ead9 */ 272116Sjkhlog10_2hi = 3.0102920532e-01, /* 0x3e9a2080 */ 282116Sjkhlog10_2lo = 7.9034151668e-07; /* 0x355427db */ 292116Sjkh 302116Sjkhstatic const float zero = 0.0; 312116Sjkh 3297413Salfredfloat 3397413Salfred__ieee754_log10f(float x) 342116Sjkh{ 35219361Sdas float f,hi,lo,y,z; 362116Sjkh int32_t i,k,hx; 372116Sjkh 382116Sjkh GET_FLOAT_WORD(hx,x); 392116Sjkh 402116Sjkh k=0; 412116Sjkh if (hx < 0x00800000) { /* x < 2**-126 */ 422116Sjkh if ((hx&0x7fffffff)==0) 432116Sjkh return -two25/zero; /* log(+-0)=-inf */ 442116Sjkh if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ 452116Sjkh k -= 25; x *= two25; /* subnormal number, scale up x */ 462116Sjkh GET_FLOAT_WORD(hx,x); 472116Sjkh } 482116Sjkh if (hx >= 0x7f800000) return x+x; 492116Sjkh k += (hx>>23)-127; 50219361Sdas hx &= 0x007fffff; 51219361Sdas i = (hx+(0x4afb0d))&0x800000; 52219361Sdas SET_FLOAT_WORD(x,hx|(i^0x3f800000)); /* normalize x or x/2 */ 53219361Sdas k += (i>>23); 54219361Sdas y = (float)k; 55219361Sdas f = __kernel_logf(x); 56219361Sdas x = x - (float)1.0; 57219361Sdas GET_FLOAT_WORD(hx,x); 58219361Sdas SET_FLOAT_WORD(hi,hx&0xfffff000); 59219361Sdas lo = x - hi; 60219361Sdas z = y*log10_2lo + (x+f)*ivln10lo + (lo+f)*ivln10hi + hi*ivln10hi; 612116Sjkh return z+y*log10_2hi; 622116Sjkh} 63