Web lists-archives.com

# Re: strtod ("nan") returns negative NaN

• Date: Wed, 15 Aug 2018 00:54:10 +0900 (JST)
• Subject: Re: strtod ("nan") returns negative NaN

```[...]
>> > With your patch, strtold looks more correct, but it still prints the
>> > sign of NaN:
>> >
>> >   strtod ("nan", NULL) = nan
>> >   strtod ("-nan", NULL) = nan
>> >   strtold ("nan", NULL) = nan
>> >   strtold ("-nan", NULL) = -nan
>> >   nan ("") = nan
>> >
>> > Question: What's wrong with that?  Wouldn't it be more correct if
>> > strtod returns -NaN for "-nan" as well?
>>
>> In my investigate,
>> strtold sets sign bit when parameter has '-' character.
>> The wrong long double NaN definition is negative NaN that is set sign bit.
>> So without my patch, both strtold ("nan") and
>> strtold ("-nan") return negative NaN.
>>
>> On the other hand, strtod inverts the sign when parameter has '-' character.
>> The wrong double NaN definition is negative NaN.
>> So without my patch, strtod ("nan") returns negative NaN
>> and strtod ("-nan") returns positive NaN.
>
> Your patch improves the situation, that's a sure thing and I did not
> question that.
>
> I just wonder why returning -NaN when the input is "-nan" isn't the
> better approach.  After all:
>
>   printf ("nan (\"\") = %f\n", nan (""));
>   printf ("-nan (\"\") = %f\n", -nan (""));
>
> ==>
>
>   nan ("") = nan
>   -nan ("") = -nan
>
> So, shouldn't the ideal outcome be this:
>
>   strtod ("nan", NULL) = nan
>   strtod ("-nan", NULL) = -nan
>   strtold ("nan", NULL) = nan
>   strtold ("-nan", NULL) = -nan
>
> ?

On Linux,
strtof ("nan"), strtof ("-nan"),
strtod ("nan"), strtod ("-nan"),
strtold ("nan"), and strtold ("-nan")
all return positive NaN.

My patch is for closing to the behavior of Linux.
I don't know why Linux's strtod ("-nan") does not return negative NaN.
But, probably because both positive and negative NaN behave in the same way,
I think.

Here's sample code.
```
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
double pnan = nan ("");
double nnan = -pnan;

printf ("positive NaN == positive NaN: ");
if (pnan == pnan)
printf ("true\n");
else
printf ("false\n");

printf ("negative NaN == negative NaN: ");
if (nnan == nnan)
printf ("true\n");
else
printf ("false\n");

printf ("0 < positive NaN: ");
if (0 < pnan)
printf ("true\n");
else
printf ("false\n");

printf ("0 > positive NaN: ");
if (0 > pnan)
printf ("true\n");
else
printf ("false\n");

printf ("0 < negative NaN: ");
if (0 < nnan)
printf ("true\n");
else
printf ("false\n");

printf ("0 > negative NaN: ");
if (0 > nnan)
printf ("true\n");
else
printf ("false\n");
}
```

Result:
```
positive NaN == positive NaN: false
negative NaN == negative NaN: false
0 < positive NaN: false
0 > positive NaN: false
0 < negative NaN: false
0 > negative NaN: false
```

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

```