Bug in Cygwin strtod()
Jeff Johnston
jjohnstn@redhat.com
Sat Dec 22 18:55:00 GMT 2012
I would urge you to be quick about it as I originally intended to make
the yearly snapshot today.
-- Jeff J.
On 12/19/2012 10:37 AM, Christian Bruel wrote:
> Humm, I understand why I didn't consider this as a failure,
>
> Here is what I got.
>
> using
> value = strtod("2.30258509299404568402", 0);
>
> with my patch:
>
> generate strtod - value: 2.302585092994045.
> expected strtod - value: 2.302585092994046.
>
> without my patch (after your revert)
>
> generate strtod - value: 2.302585092994046.
> expected strtod - value: 2.302585092994046.
>
> I thought that no rounding was necessary, but reading 7.20.1.3.9 it is
> clearly said that the result should be correctly rounded.
>
> So this is a rounding bug with my patch indeed, that I'd like to fix.
> Since reverting my patch totally messes up the __DBL_DIG__ == 6 targets.
>
> I'll let you know,
>
> Christian
>
>
> On 12/19/2012 11:16 AM, Corinna Vinschen wrote:
>> Here's an error report w/ replies on the Cygwin list:
>>
>> On Dec 19 08:03, marco atzeri wrote:
>>> On 12/19/2012 2:30 AM, KHMan wrote:
>>>> On 12/19/2012 8:54 AM, Cary R. wrote:
>>>>> The following code demonstrates a subtle bug in the Cygwin version of
>>>>> strtod(). The value it generates is slightly different than the value
>>>>> when using the math header files. This used to work correctly some
>>>>> time ago (months). I just took the time to track the problem down in
>>>>> our regression suite.
>>>>>
>>>>> #include<math.h>
>>>>> #include<stdio.h>
>>>>> #include<stdlib.h>
>>>>>
>>>>> int main()
>>>>> {
>>>>> double value = M_LN10;
>>>>>
>>>>> printf("generate const. - value: %0.15f.\n", value);
>>>>> printf("expected const. - value: 2.302585092994046.\n");
>>>>>
>>>>> printf("\n");
>>>>> value = strtod("2.30258509299404568402", 0);
>>>>>
>>>>> /* Note: the last digit is incorrect. */
>>>>> printf("generate strtod - value: %0.15f.\n", value);
>>>>> printf("expected strtod - value: 2.302585092994046.\n");
>>>>>
>>>>> return 0;
>>>>> }
>>>>
>>>> Yep, looks like the significand misses its mark by 1.
>>>>
>>>
>>> strtod is from newlib.
>>> the last change in the code is one year and half ago
>>>
>>> http://sourceware.org/cgi-bin/cvsweb.cgi/src/newlib/libc/stdlib/strtod.c.diff?r1=1.17&r2=1.18&cvsroot=src
>>
>> In fact, the aforementioned change is the culprit of the wrong
>> result. The discussion about the patch starts here:
>> http://sourceware.org/ml/newlib/2011/msg00178.html
>>
>> For now I have reverted the patch. It might have fixed some problem,
>> but it introduced a new one, so it was apparently not correct, and I
>> was not able to reproduce the described problem in the first place.
>>
>>
>> Corinna
>>
More information about the Newlib
mailing list