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

Nicolas Brunie nbrunie@kalray.eu
Fri Feb 14 08:11:00 GMT 2020


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 

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(""); 
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test_pow_m1_nan.c
Type: text/x-c++src
Size: 242 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20200214/f2cacaa6/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: newlib_pow_m1.patch
Type: text/x-patch
Size: 550 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20200214/f2cacaa6/attachment-0001.bin>


More information about the Newlib mailing list