| delorie.com/archives/browse.cgi | search |
| X-Recipient: | archive-cygwin AT delorie DOT com |
| DomainKey-Signature: | a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id |
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:date:message-id:to:cc:subject:from:in-reply-to | |
| :references:mime-version:content-type:content-transfer-encoding; | |
| q=dns; s=default; b=a5f7wSi8sz0jOJElzJFQiorRWrOhsMW9AfJaesVS4fc | |
| /MKtlKweyFBKAMWuNobfMC04nATl1yzJTHxd5cNA4Ysr0qD5y2+VnM/6qSaTWz78 | |
| HLsnhiMNzSVH1F2oh2N7ZRB62+ETuiXzCdn013zh2ePCV8pBghpkOpVfDNCMWuXk | |
| = | |
| DKIM-Signature: | v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id |
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:date:message-id:to:cc:subject:from:in-reply-to | |
| :references:mime-version:content-type:content-transfer-encoding; | |
| s=default; bh=BR4DVI7x+F1fc5GPg4H/C5win1Y=; b=pnmN3vfFEuzSLZ8/S | |
| tcF/ZplPtqX6RvEdkn550Fw76KitYZhIsp7inJtg8QBIHa7kjJew4quAww9dL60H | |
| jzYR7PxQcfVSOYgvLwscPMQ3mcFywc6Gq44UyUdrMxn7y94AQBCWyMIa3D9SOHI2 | |
| r8y5/8enyts2Xys4MuYpyqluy8= | |
| Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm |
| List-Id: | <cygwin.cygwin.com> |
| List-Subscribe: | <mailto:cygwin-subscribe AT cygwin DOT com> |
| List-Archive: | <http://sourceware.org/ml/cygwin/> |
| List-Post: | <mailto:cygwin AT cygwin DOT com> |
| List-Help: | <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs> |
| Sender: | cygwin-owner AT cygwin DOT com |
| Mail-Followup-To: | cygwin AT cygwin DOT com |
| Delivered-To: | mailing list cygwin AT cygwin DOT com |
| Authentication-Results: | sourceware.org; auth=none |
| X-Spam-SWARE-Status: | No, score=-2.1 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 spammy=H*Ad:D*jp |
| X-HELO: | msc14.plala.or.jp |
| Date: | Wed, 15 Aug 2018 00:54:10 +0900 (JST) |
| Message-Id: | <20180815.005410.1198201163154042143.trueroad@trueroad.jp> |
| To: | cygwin AT cygwin DOT com |
| Cc: | trueroad AT trueroad DOT jp |
| Subject: | Re: strtod ("nan") returns negative NaN |
| From: | Masamichi Hosoda <trueroad AT trueroad DOT jp> |
| In-Reply-To: | <20180814132301.GX3747@calimero.vinschen.de> |
| References: | <20180814 DOT 211757 DOT 2066454831159853501 DOT trueroad AT trueroad DOT jp> <20180814_dot_211757_dot_2066454831159853501_dot_trueroad_at_trueroad_dot_jp> <20180814132301 DOT GX3747 AT calimero DOT vinschen DOT de> |
| Mime-Version: | 1.0 |
| X-VirusScan: | Outbound; mvir-ac14; Wed, 15 Aug 2018 00:54:15 +0900 |
[...]
>> > 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
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |