summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMasamichi Hosoda <trueroad@trueroad.jp>2018-08-16 09:18:50 +0900
committerCorinna Vinschen <corinna@vinschen.de>2018-08-16 13:17:44 +0200
commit6c212a8b7873703c4f98c6b68579b234918be83a (patch)
tree7e0cd5a26100af8a21664affe941dd0d75e952c8
parent8f1259a6ef03edfa0f8e8b28fcaa13410b4e6b10 (diff)
downloadcygnal-6c212a8b7873703c4f98c6b68579b234918be83a.tar.gz
cygnal-6c212a8b7873703c4f98c6b68579b234918be83a.tar.bz2
cygnal-6c212a8b7873703c4f98c6b68579b234918be83a.zip
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.
-rw-r--r--newlib/libc/stdlib/strtod.c5
-rw-r--r--newlib/libc/stdlib/strtorx.c6
2 files changed, 2 insertions, 9 deletions
diff --git a/newlib/libc/stdlib/strtod.c b/newlib/libc/stdlib/strtod.c
index 0cfa9e6ae..d70d2c25b 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 aeeb25066..f923fdfe1 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;