21 Oct 2002
bug fix in e_pow.c from "David G Hough at validlab.com" <[email protected]>.
credit for bug report goes to [email protected]
test example:
-----------------------------
static int fail=0;
trypow(x,y,z)
double x,y,z;
{
extern double pow();
double p ;
p = pow(x,y);
if (p != z) {
printf(" pow failure x %e y %e computed %e correct %e \n",x,y,p,z);
fail++;
return;
}
if (1/p != 1/z) {
printf(" pow failure x %e y %e computed %e correct %e \n",x,y,p,z);
fail++;
return;
}
}
main()
{
trypow( 1.0000000001, 1.0000000001E10, 2.7182820535066154);
trypow(-1.0000000001, 1.0000000001E10, -2.7182820535066154);
trypow(-0.001, 1.0000000001E10, -0.0);
trypow(-1000.0, 1.0000000001E10, -1.0/0.0);
if (fail == 0) {
printf(" fdlibm e_pow.c seems to be current \n");
exit(0);
}
else {
printf(" fdlibm e_pow.c seems to be out of date \n");
exit(1);
}
}
-----------------------------
What's new in FDLIBM 5.3?
CONFIGURE
To build FDLIBM, edit the supplied Makefile or create
a local Makefile by running "sh configure"
using the supplied configure script contributed by Nelson Beebe
BUGS FIXED
1. e_pow.c incorrect results when
x is very close to -1.0 and y is very large, e.g.
pow(-1.0000000000000002e+00,4.5035996273704970e+15) = 0
pow(-9.9999999999999978e-01,4.5035996273704970e+15) = 0
Correct results are close to -e and -1/e.
2. k_tan.c error was > 1 ulp target for FDLIBM
5.2: Worst error at least 1.45 ulp at
tan(1.7765241907548024E+269) = 1.7733884462610958E+16
5.3: Worst error 0.96 ulp
NOT FIXED YET
3. Compiler failure on non-standard code
Statements like
*(1+(int*)&t1) = 0;
are not standard C and cause some optimizing compilers (e.g. GCC)
to generate bad code under optimization. These cases
are to be addressed in the next release.
|