• Sam Lantinga's avatar
    http://sources.redhat.com/ml/newlib/2002/msg00230.html · 5f94466c
    Sam Lantinga authored
    Stephen L Moshier wrote:
    >
    > pow(x,y) returns 0 when x is very close to -1.0 and y is very large.
    > The following test program prints
    >
    > pow(1.0000000000000002e+00 4.5035996273704970e+15) = 2.7182818284590455e+00
    > pow(-1.0000000000000002e+00 4.5035996273704970e+15) =0.0000000000000000e+00
    > pow(9.9999999999999978e-01 4.5035996273704970e+15) = 3.6787944117144222e-01
    > pow(-9.9999999999999978e-01 4.5035996273704970e+15) = 0.0000000000000000e+00
    >
    > which is incorrect for the negative arguments raised to an odd integer
    > power.
    >
    > -----
    > double pow (double, double);
    >
    > int
    > main ()
    > {
    >   double x, y, z;
    >
    >   x = 1.0 + pow (2.0, -52.0);
    >   y = 1.0 + pow (2.0, 52.0);
    >   z = pow (x, y);
    >   printf ("pow(%.16e %.16e) = %.16e\n", x, y, z);
    >   x = -x;
    >   z = pow (x, y);
    >   printf ("pow(%.16e %.16e) = %.16e\n", x, y, z);
    >   x = 1.0 - pow (2.0, -52.0);
    >   z = pow (x, y);
    >   printf ("pow(%.16e %.16e) = %.16e\n", x, y, z);
    >   x = -x;
    >   z = pow (x, y);
    >   printf ("pow(%.16e %.16e) = %.16e\n", x, y, z);
    > }
    > -----
    >
    > Here is a patch for newlib/libm/math/epow.c:
    
    Patch checked in and duplicated for ef_pow.c.  Thanks.
    
    -- Jeff J.
    
    --HG--
    extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403207
    5f94466c
e_pow.h 11.7 KB