From a47e66ae3a33750f37505df1a4871fe84438ca34 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 13 Jun 2002 23:03:01 +0000 Subject: [PATCH] 2002-06-13 Stephen L. Moshier * libm/math/e_pow.c (__ieee754_pow): Fix case whereby x is close to -1.0 and y is very large to use ax (absolute value) instead of x. * libm/math/ef_pow.c (__ieee754_powf): Ditto. --- newlib/ChangeLog | 9 +++++++++ newlib/libm/math/e_pow.c | 2 +- newlib/libm/math/ef_pow.c | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index c51adc4de..5eb6ac4e1 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,12 @@ +2002-06-13 Stephen L. Moshier + + * libm/math/e_pow.c (__ieee754_pow): Fix case whereby + x is close to -1.0 and y is very large to use ax (absolute value) + instead of x. + * libm/math/ef_pow.c (__ieee754_powf): Ditto. + +Thu Jun 13 19:23:40 2002 J"orn Rennecke + Thu Jun 13 19:23:40 2002 J"orn Rennecke * libc/machine/sh/strcpy.S (strcpy, __SHMEDIA__ code): diff --git a/newlib/libm/math/e_pow.c b/newlib/libm/math/e_pow.c index 240a18613..55b5f7f5b 100644 --- a/newlib/libm/math/e_pow.c +++ b/newlib/libm/math/e_pow.c @@ -196,7 +196,7 @@ ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/ if(ix>0x3ff00000) return (hy>0)? huge*huge:tiny*tiny; /* now |1-x| is tiny <= 2**-20, suffice to compute log(x) by x-x^2/2+x^3/3-x^4/4 */ - t = x-1; /* t has 20 trailing zeros */ + t = ax-1; /* t has 20 trailing zeros */ w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25)); u = ivln2_h*t; /* ivln2_h has 21 sig. bits */ v = t*ivln2_l-w*ivln2; diff --git a/newlib/libm/math/ef_pow.c b/newlib/libm/math/ef_pow.c index e50cc58b3..8b1fc18b7 100644 --- a/newlib/libm/math/ef_pow.c +++ b/newlib/libm/math/ef_pow.c @@ -137,7 +137,7 @@ ivln2_l = 7.0526075433e-06; /* 0x36eca570 =1/ln2 tail*/ if(ix>0x3f800007) return (hy>0)? huge*huge:tiny*tiny; /* now |1-x| is tiny <= 2**-20, suffice to compute log(x) by x-x^2/2+x^3/3-x^4/4 */ - t = x-1; /* t has 20 trailing zeros */ + t = ax-1; /* t has 20 trailing zeros */ w = (t*t)*((float)0.5-t*((float)0.333333333333-t*(float)0.25)); u = ivln2_h*t; /* ivln2_h has 16 sig. bits */ v = t*ivln2_l-w*ivln2;