Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* ef_log10.c -- float version of e_log10.c.
  2.  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
  3.  */
  4.  
  5. /*
  6.  * ====================================================
  7.  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  8.  *
  9.  * Developed at SunPro, a Sun Microsystems, Inc. business.
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software is freely granted, provided that this notice
  12.  * is preserved.
  13.  * ====================================================
  14.  */
  15.  
  16. #include "fdlibm.h"
  17.  
  18. #ifdef __STDC__
  19. static const float
  20. #else
  21. static float
  22. #endif
  23. two25      =  3.3554432000e+07, /* 0x4c000000 */
  24. ivln10     =  4.3429449201e-01, /* 0x3ede5bd9 */
  25. log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
  26. log10_2lo  =  7.9034151668e-07; /* 0x355427db */
  27.  
  28. #ifdef __STDC__
  29. static const float zero   =  0.0;
  30. #else
  31. static float zero   =  0.0;
  32. #endif
  33.  
  34. #ifdef __STDC__
  35.         float __ieee754_log10f(float x)
  36. #else
  37.         float __ieee754_log10f(x)
  38.         float x;
  39. #endif
  40. {
  41.         float y,z;
  42.         __int32_t i,k,hx;
  43.  
  44.         GET_FLOAT_WORD(hx,x);
  45.  
  46.         k=0;
  47.         if (FLT_UWORD_IS_ZERO(hx&0x7fffffff))
  48.             return -two25/zero;             /* log(+-0)=-inf */
  49.         if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
  50.         if (!FLT_UWORD_IS_FINITE(hx)) return x+x;
  51.         if (FLT_UWORD_IS_SUBNORMAL(hx)) {
  52.             k -= 25; x *= two25; /* subnormal number, scale up x */
  53.             GET_FLOAT_WORD(hx,x);
  54.         }
  55.         k += (hx>>23)-127;
  56.         i  = ((__uint32_t)k&0x80000000)>>31;
  57.         hx = (hx&0x007fffff)|((0x7f-i)<<23);
  58.         y  = (float)(k+i);
  59.         SET_FLOAT_WORD(x,hx);
  60.         z  = y*log10_2lo + ivln10*__ieee754_logf(x);
  61.         return  z+y*log10_2hi;
  62. }
  63.