Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Mar 2011 03:12:08 +0000 (UTC)
From:      David Schultz <das@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r219361 - head/lib/msun/src
Message-ID:  <201103070312.p273C88q019619@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: das
Date: Mon Mar  7 03:12:08 2011
New Revision: 219361
URL: http://svn.freebsd.org/changeset/base/219361

Log:
  Convert log10f() to use __kernel_log(), which is more accurate and simpler.

Modified:
  head/lib/msun/src/e_log10f.c

Modified: head/lib/msun/src/e_log10f.c
==============================================================================
--- head/lib/msun/src/e_log10f.c	Mon Mar  7 03:11:27 2011	(r219360)
+++ head/lib/msun/src/e_log10f.c	Mon Mar  7 03:12:08 2011	(r219361)
@@ -1,7 +1,3 @@
-/* e_log10f.c -- float version of e_log10.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
 /*
  * ====================================================
  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@@ -16,12 +12,18 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+/*
+ * Return the base 10 logarithm of x. See k_log.c for details on the algorithm.
+ */
+
 #include "math.h"
 #include "math_private.h"
+#include "k_logf.h"
 
 static const float
 two25      =  3.3554432000e+07, /* 0x4c000000 */
-ivln10     =  4.3429449201e-01, /* 0x3ede5bd9 */
+ivln10hi   =  4.3432617188e-01, /* 0x3ede6000 */
+ivln10lo   = -3.1689971365e-05, /* 0xb804ead9 */
 log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
 log10_2lo  =  7.9034151668e-07; /* 0x355427db */
 
@@ -30,7 +32,7 @@ static const float zero   =  0.0;
 float
 __ieee754_log10f(float x)
 {
-	float y,z;
+	float f,hi,lo,y,z;
 	int32_t i,k,hx;
 
 	GET_FLOAT_WORD(hx,x);
@@ -45,10 +47,16 @@ __ieee754_log10f(float x)
         }
 	if (hx >= 0x7f800000) return x+x;
 	k += (hx>>23)-127;
-	i  = ((u_int32_t)k&0x80000000)>>31;
-        hx = (hx&0x007fffff)|((0x7f-i)<<23);
-        y  = (float)(k+i);
-	SET_FLOAT_WORD(x,hx);
-	z  = y*log10_2lo + ivln10*__ieee754_logf(x);
+	hx &= 0x007fffff;
+	i = (hx+(0x4afb0d))&0x800000;
+	SET_FLOAT_WORD(x,hx|(i^0x3f800000));	/* normalize x or x/2 */
+	k += (i>>23);
+	y = (float)k;
+	f = __kernel_logf(x);
+	x = x - (float)1.0;
+	GET_FLOAT_WORD(hx,x);
+	SET_FLOAT_WORD(hi,hx&0xfffff000);
+	lo = x - hi;
+	z = y*log10_2lo + (x+f)*ivln10lo + (lo+f)*ivln10hi + hi*ivln10hi;
 	return  z+y*log10_2hi;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103070312.p273C88q019619>