From: Masamichi Hosoda <trueroad@trueroad.jp>
To: cygwin@cygwin.com
Cc: trueroad@trueroad.jp
Subject: Re: strtod ("nan") returns negative NaN
Date: Tue, 14 Aug 2018 16:05:00 -0000 [thread overview]
Message-ID: <20180815.005410.1198201163154042143.trueroad@trueroad.jp> (raw)
In-Reply-To: <20180814132301.GX3747@calimero.vinschen.de>
[...]
>> > 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
next prev parent reply other threads:[~2018-08-14 15:54 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-13 15:16 `std::stod ("nan")` " Masamichi Hosoda
2018-08-13 16:53 ` Stephen John Smoogen
2018-08-13 23:46 ` Duncan Roe
2018-08-14 0:46 ` Stephen John Smoogen
2018-08-14 1:10 ` Masamichi Hosoda
2018-08-14 2:31 ` strtod ("nan") returns negative NaN (was `std::stod ("nan")` returns negative NaN) Masamichi Hosoda
2018-08-14 3:25 ` strtod ("nan") returns negative NaN Steven Penny
2018-08-14 4:46 ` Masamichi Hosoda
2018-08-14 9:56 ` Corinna Vinschen
2018-08-14 10:39 ` Corinna Vinschen
2018-08-14 12:18 ` Masamichi Hosoda
2018-08-14 13:23 ` Corinna Vinschen
2018-08-14 13:41 ` Stephen John Smoogen
2018-08-14 15:25 ` Heavenly Avenger
2018-08-14 15:54 ` Corinna Vinschen
2018-08-14 17:08 ` Heavenly Avenger
2018-08-14 16:05 ` Masamichi Hosoda [this message]
2018-08-14 19:24 ` Steven Penny
2018-08-14 21:45 ` Andy Moreton
2018-08-14 22:23 ` Stephen John Smoogen
2018-08-15 0:02 ` Eric Blake
2018-08-15 7:36 ` Steven Penny
2018-08-21 3:18 ` Brian Inglis
2018-08-14 19:44 ` Achim Gratz
2018-08-21 13:28 ` Brian Inglis
2018-08-14 15:05 ` Masamichi Hosoda
2018-08-14 15:21 ` Masamichi Hosoda
2018-08-14 15:35 ` Heavenly Avenger
2018-08-14 20:05 ` Joseph Myers
2018-08-14 20:19 ` Joseph Myers
2018-08-15 8:51 ` Masamichi Hosoda
2018-08-15 12:55 ` Masamichi Hosoda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180815.005410.1198201163154042143.trueroad@trueroad.jp \
--to=trueroad@trueroad.jp \
--cc=cygwin@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).