This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: Bug in Cygwin strtod()
- From: Christian Bruel <christian dot bruel at st dot com>
- To: "newlib at sourceware dot org" <newlib at sourceware dot org>
- Cc: Corinna Vinschen <corinna-cygwin at cygwin dot com>
- Date: Wed, 19 Dec 2012 12:44:00 +0100
- Subject: Re: Bug in Cygwin strtod()
- References: <1355878473.91036.YahooMailNeo@web121001.mail.ne1.yahoo.com> <50D118CE.8090108@gmail.com> <50D166D2.3030505@gmail.com> <20121219101618.GA13560@calimero.vinschen.de>
Hello Corinna,
The current strtod patchlet doesn't look the posted patch. For instance
in newlib 1.20, strtod.c:339 I see
if (nd + i < 10)
while in my patch it was
if (nd + 1 < 10)
I don't know if this is because my patch was not correctly applied, or
if this is the result of a subsequent conflict, but it's no surprised
that current code is wrong with regard to what I've tested.
For now on sh4, I can't notice the problem (but I use my version of the
patch). Do you know if this is reproducible only on Cygwin ? It is
easier for me to check on Linux. I'll try to reproduce on any target and
give a status.
Regards,
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
>