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

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Nicolas Brunie
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("");
}

test_pow_m1_nan.c (336 bytes) Download Attachment
newlib_pow_m1.patch (762 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

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

Corinna Vinschen
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

signature.asc (849 bytes) Download Attachment