[PATCH] Fix strtod for small DBL_DIG

Steven Abner pheonix@zoomtown.com
Mon May 16 13:15:00 GMT 2011


On May 16, 2011, at 8:33 AM, Corinna Vinschen wrote:

> On May 16 14:21, Christian Bruel wrote:
>> Hi Corinna,
>> 
>> Thanks for having testing it on cygwin32.
>> 
>> On 05/16/2011 01:36 PM, Corinna Vinschen wrote:
>>> This code always aborts because the value 12.345678 is not representable
>>> as 32 bit float value.  The same happens when using glibc as well.  If
>>> you print the float values with many digits, you get something like
>>> 
>>>  12.34567832946777 for DVal1 and
>>>  12.34567928314209 for dtmp.
>>> 
>>> on both, Cygwin/newlib and Linux/glibc.
>>> 
>>> Also, this does *not* change if I use your patch.
>>> 
>> 
>> Sorry, I was not clear about the original bug and what the patch was
>> fixing. It is not a precision problem, but really a magnitude
>> problem. So indeed my example fails for precision errors, but that
>> was not the original goal.
>> 
>> Please find attached the revisited test case that is will expose the
>> bug more precisely.
>> 
>> on the SH4 -m4-single-only GCC (which means doubles are 32 bit) I
>> get the values: 1.234568 12.345679 printed,
>> 
>> which is not a problem of representation problem, but a true conversion bug.
> 
> Thanks for the testcase.  However, I can still not reproduce the
> problem.  I tried again with float and strtof on Cygwin, but
> regardless of running it with or without your patch, it results
> in printing
> 
>  12.3456789 12.3456789
> 
> The strtod_r code is plain C so I'd expect that the conversion
> is target independent.  So why would it fail for arm but not for
> i386?
> 
> 
> Corinna
> 
> -- 
> Corinna Vinschen
> Cygwin Project Co-Leader
> Red Hat

A little off topic, but Corinna found bug in printf
default precision print out should be 6 digits...
but using two different source codes, I get using floats as
Corinna 12.345679 12.345679
could it be a printf problem instead?
i386 also

Steve




More information about the Newlib mailing list