[kaffe] Re: The problem of "Double.c and buggy strtod" is settled

Dalibor Topic robilad@yahoo.com
Thu Jun 5 10:37:02 2003


--0-1944349332-1054834778=:23779
Content-Type: text/plain; charset=us-ascii
Content-Id: 
Content-Disposition: inline

Hi Ito,

--- Dalibor Topic <robilad@yahoo.com> wrote:
> 
> --- Ito Kazumitsu <kaz@maczuka.gcd.org> wrote:
> > >>>>> "*" == Ito Kazumitsu <kaz@maczuka.gcd.org> writes:
> > 
> > *> In fact, FreeBSD 4.7-RELEASE's /usr/include/float.h says
> > *> #define DBL_MIN         2.2250738585072014E-308
> > *> and replace/strtod.c says, when HAVE_FLOAT_H is undefined,
> > *> almost the same thing:
> > *> # define DBL_MIN 2.2250738585072010e-308
> > *> I remember Linux 2.0.x's float.h also defines something like this.
> > *> 
> > *> So Java's double MIN_VALUE 4.9406564584124654418e-324 will be
> > *> considered to be 0.0 by this strtod.c.
> > 
> > Studying this issue further,  I found that DBL_MIN is not the only
> > factor that makes strtod convert 4.9406564584124654418e-324 to 0.0.
> > 
> > Even if I comment out 
> >        if (num < DBL_MIN * pow (10.0, (double) -exponent))
> >         goto underflow;
> > this strtod converts 4.9406564584124654418e-324 to 0.0 although
> > errno is not set.
> > 
> > Inserting "printf("## num, exp = %f, %d\n", num, exponent);"
> > before "num *= pow (10.0, (double) exponent);",  I get
> > "## num, exp = 49406564584124661760.000000, -343".  So
> > the reason why 4.9406564584124654418e-324 becomes 0.0
> > seems to be the limitation of the function pow().
> 
> o.k., since the strtod from libit doesn't work, the one from libiberty (gcc)
> doesn't work either, I'll see if I can get the one from NetBSD to work, since
> you've had some success with it. 

the netbsd strtod seems to need some includes that I don't have around, and the
netlib strtod wants me to specify way more about IEEE than I know ;) The one
from glibc is entangles in the glibc mess of headers, so I took another look at
the one from libiberty. I hope that the attached patch works, I've tried a
slightly adapted DoubleTest.c and it worked for me:

bash-2.05a$ gcc -g DoubleTest.c libiberty-strtod.c safe-ctype.c -I .
bash-2.05a$ ./a.out 4.9406564584124654418e-324
4.9406564584124654418e-324 0              4.94065645841246544177e-324
bash-2.05a$ cat DoubleTest.c
#include <stdlib.h>
extern int errno;

int main(int argc, char* argv[]) {
   double d = strtod(argv[1], NULL);
   printf("%s %d %40.20e\n",argv[1], errno, d);
}

cheers,
dalibor topic

__________________________________
Do you Yahoo!?
Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
http://calendar.yahoo.com
--0-1944349332-1054834778=:23779
Content-Type: application/x-tar-gz; name="dalibor-strtod-2-newfiles.tgz"
Content-Transfer-Encoding: base64
Content-Description: dalibor-strtod-2-newfiles.tgz
Content-Disposition: attachment; filename="dalibor-strtod-2-newfiles.tgz"

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

--0-1944349332-1054834778=:23779
Content-Type: application/gzip; name="dalibor-strtod-2.diff.gz"
Content-Transfer-Encoding: base64
Content-Description: dalibor-strtod-2.diff.gz
Content-Disposition: attachment; filename="dalibor-strtod-2.diff.gz"

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
AA==

--0-1944349332-1054834778=:23779--