From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 96985 invoked by alias); 17 Aug 2018 09:37:12 -0000 Mailing-List: contact newlib-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-cvs-owner@sourceware.org Received: (qmail 96616 invoked by uid 9078); 17 Aug 2018 09:37:11 -0000 Date: Fri, 17 Aug 2018 09:37:00 -0000 Message-ID: <20180817093711.96612.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] Fix strtod ("nan") and strtold ("nan") returns wrong negative NaN X-Act-Checkin: newlib-cygwin X-Git-Author: Masamichi Hosoda X-Git-Refname: refs/heads/master X-Git-Oldrev: 8f1259a6ef03edfa0f8e8b28fcaa13410b4e6b10 X-Git-Newrev: 6c212a8b7873703c4f98c6b68579b234918be83a X-SW-Source: 2018-q3/txt/msg00046.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=6c212a8b7873703c4f98c6b68579b234918be83a commit 6c212a8b7873703c4f98c6b68579b234918be83a Author: Masamichi Hosoda Date: Thu Aug 16 09:18:50 2018 +0900 Fix strtod ("nan") and strtold ("nan") returns wrong negative NaN The definition of qNaN for x86_64 and i386 was wrong. strto{d|ld} ("nan") returned wrong negative NaN instead of correct positive NaN since it used the wrong definition. On the other hand, strtof ("nan") returns correct positive NaN since it uses nanf ("") instead of the wrong definition. This commit makes strto{d|ld} ("nan") uses {nan|nanl} ("") like strtof ("nan") using. So strto{d|ld} ("nan") returns positive NaN. Diff: --- newlib/libc/stdlib/strtod.c | 5 +---- newlib/libc/stdlib/strtorx.c | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/newlib/libc/stdlib/strtod.c b/newlib/libc/stdlib/strtod.c index 0cfa9e6..d70d2c2 100644 --- a/newlib/libc/stdlib/strtod.c +++ b/newlib/libc/stdlib/strtod.c @@ -444,10 +444,7 @@ _strtod_l (struct _reent *ptr, const char *__restrict s00, char **__restrict se, } else { #endif - dword0(rv) = NAN_WORD0; -#ifndef _DOUBLE_IS_32BITS - dword1(rv) = NAN_WORD1; -#endif /*!_DOUBLE_IS_32BITS*/ + dval(rv) = nan (""); #ifndef No_Hex_NaN } #endif diff --git a/newlib/libc/stdlib/strtorx.c b/newlib/libc/stdlib/strtorx.c index aeeb250..f923fdf 100644 --- a/newlib/libc/stdlib/strtorx.c +++ b/newlib/libc/stdlib/strtorx.c @@ -93,11 +93,7 @@ ULtox(__UShort *L, __ULong *bits, Long exp, int k) break; case STRTOG_NaN: - L[0] = ldus_QNAN0; - L[1] = ldus_QNAN1; - L[2] = ldus_QNAN2; - L[3] = ldus_QNAN3; - L[4] = ldus_QNAN4; + *((long double*)L) = nanl (""); } if (k & STRTOG_Neg) L[_0] |= 0x8000;