This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: question on wrong result for small numbers from strtod(), strtof()


Daniel:
     I have taken a look at it, and although not familiar with the
routine, I think that I found the problem.  However, I don't have
a platform to test on with 32-bit double.  Please try the attached
addition and let me know how it works.
     (This fix is really a bit of a kludge, cleaning up a problem
after it was made rather than fixing the root cause, but this is
much easier, as stopping it from happening is much more work.)
     Given the nature of the mistake in strtod, it would not
be entirely surprising if other cases also caused problems.  I
don't know if you have them already or not, but some additional
test cases for things like overflows, underflows, and subnormals
seem like a good idea (e.g. -1.2345678e39, 8.7654321e-45, and
1.2345678e-42.).
				Craig


-----Original Message-----
From: newlib-owner@sourceware.org [mailto:newlib-owner@sourceware.org]
On Behalf Of Daniel Calcoen
Sent: Friday, October 22, 2010 10:37 AM
To: newlib@sourceware.org
Subject: question on wrong result for small numbers from strtod(),
strtof()

I'm compiling for Renesas RX with gcc 4.5 (Newlib 1.18.0)
As RX floating point unit is 32bits the compiler defines double=float
(32bits)
and DBL_DIG=FLT_DIG=6

( the following is exactly the same for strtod() )
When I do a strof() for the string "1.17549434E-37"
I end with the float 1.175494e-035, where the mantissa is ok but the
exponent is wrong.

following the code of strtod.c at line 442

	k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;

k is 7 (nd=9 and DBL_DIG=6)
then goes to line 523

	e1 += nd - k;


where e1 (-45) is adjusted to -43 
(the mantissa was converted correctly, rv.d=1.1754943e+8)

then the approximation will end with 1.175494e-035 (instead of
1.175494e-037)

I don't understand all the details of the precision check and the
approximation that follows so I looking for help to solve my problem.

When I compile for double=64 bits and float=32bits so DBL_DIG=15 the
results
are correct.

Daniel Calcoen

Attachment: strtod.patch
Description: strtod.patch


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]