Possible issue with pow(-1, NaN) in newlib's libm

Message ID 1912584276.4308250.1581667885581.JavaMail.zimbra@kalray.eu
State New
Headers show
Series
  • Possible issue with pow(-1, NaN) in newlib's libm
Related show

Commit Message

Nicolas Brunie Feb. 14, 2020, 8:11 a.m.
Hello all, 

First time sender, excuse me if I misspoke. 

I think I may have encountered a bug in the implementation of pow: 
pow(-1.0, NaN) returns 1.0 when it should return NaN. 
Because ix is used to check input vs 1.0 rather than hx, -1.0 is mistaken for 1.0 


Test in attachment: 
Patch suggestion in attachement and below: 

Regards, 
N. Brunie

Comments

Corinna Vinschen Feb. 14, 2020, 9:15 a.m. | #1
Hi Nicolas,

On Feb 14 09:11, Nicolas Brunie wrote:
> Hello all, 

> 

> First time sender, excuse me if I misspoke. 

> 

> I think I may have encountered a bug in the implementation of pow: 

> pow(-1.0, NaN) returns 1.0 when it should return NaN. 

> Because ix is used to check input vs 1.0 rather than hx, -1.0 is mistaken for 1.0 


You are right, thanks for catching!  I pushed your patch.

Next time, please send the patch in `git format-patch' format,
that's easier to apply :)


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat

Patch

diff --git a/newlib/libm/math/e_pow.c b/newlib/libm/math/e_pow.c
index 6d2a501..5fd28e6 100644
--- a/newlib/libm/math/e_pow.c
+++ b/newlib/libm/math/e_pow.c
@@ -122,7 +122,7 @@  ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
     /* x|y==NaN return NaN unless x==1 then return 1 */
 	if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
 	   iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0))) {
-	    if(((ix-0x3ff00000)|lx)==0) return one;
+	    if(((hx-0x3ff00000)|lx)==0) return one;
 	    else return nan("");	
 	}