Bug 39236 - error in e_pow.c
Summary: error in e_pow.c
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: misc (show other bugs)
Version: Unspecified
Hardware: Any Any
: Normal Affects Only Me
Assignee: freebsd-bugs (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2002-06-13 20:40 UTC by Stephen L Moshier
Modified: 2002-06-24 11:16 UTC (History)
0 users

See Also:


Attachments
file.diff (817 bytes, patch)
2002-06-13 20:40 UTC, Stephen L Moshier
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Stephen L Moshier 2002-06-13 20:40:01 UTC
 pow(x,y) returns 0 when x is very close to -1.0 and y is very large.

Fix: freebsd: src/lib/msun/src/e_pow.c
*** e_pow.c     1999/07/13 23:49:20     1.1
--- e_pow.c     2002/06/13 17:06:57
***************
How-To-Repeat:    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);
}
Comment 1 Bruce Evans freebsd_committer freebsd_triage 2002-06-24 11:14:33 UTC
State Changed
From-To: open->closed

Patch applied in rev.1.9 (-current) and rev.1.6.2.1 (RELENG_4) of e_pow.c. 
Applied same patch to e_powf.c although it is just cosmetic there. 

Thanks.