You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.0 KiB
77 lines
2.0 KiB
21 Oct 2002 |
|
bug fix in e_pow.c from "David G Hough at validlab.com" <validlab@validlab.com>. |
|
credit for bug report goes to andrew_johnson@uk.ibm.com |
|
test example: |
|
----------------------------- |
|
static int fail=0; |
|
|
|
trypow(x,y,z) |
|
double x,y,z; |
|
{ |
|
extern double ieee_pow(); |
|
double p ; |
|
|
|
p = ieee_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. |
|
ieee_pow(-1.0000000000000002e+00,4.5035996273704970e+15) = 0 |
|
ieee_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 |
|
ieee_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. |
|
|
|
|