about summary refs log tree commit diff
path: root/src/math/__fpclassifyl.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-06-20 15:15:10 -0400
committerRich Felker <dalias@aerifal.cx>2012-06-20 15:15:10 -0400
commitfad231b9609470e4c51b29b6bcb9abd23b7e9346 (patch)
tree22223311b6373b4a5f493ffc0892df05daeed54e /src/math/__fpclassifyl.c
parentc21a19d5a559cbd39963b89547900d24624f1fad (diff)
downloadmusl-fad231b9609470e4c51b29b6bcb9abd23b7e9346.tar.gz
musl-fad231b9609470e4c51b29b6bcb9abd23b7e9346.tar.xz
musl-fad231b9609470e4c51b29b6bcb9abd23b7e9346.zip
support ld80 pseudo-denormal invalid bit patterns; treat them as nan
this is silly, but it makes apps that read binary junk and interpret
it as ld80 "safer", and it gets gnulib to stop replacing printf...
Diffstat (limited to 'src/math/__fpclassifyl.c')
-rw-r--r--src/math/__fpclassifyl.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/math/__fpclassifyl.c b/src/math/__fpclassifyl.c
index a5ad36f2..e4d231b5 100644
--- a/src/math/__fpclassifyl.c
+++ b/src/math/__fpclassifyl.c
@@ -7,8 +7,11 @@ int __fpclassifyl(long double x)
 {
 	union ldshape u = { x };
 	int e = u.bits.exp;
-	if (!e)
-		return u.bits.m ? FP_SUBNORMAL : FP_ZERO;
+	if (!e) {
+		if (u.bits.m >> 63) return FP_NAN;
+		else if (u.bits.m) return FP_SUBNORMAL;
+		else return FP_ZERO;
+	}
 	if (e == 0x7fff)
 		return u.bits.m & (uint64_t)-1>>1 ? FP_NAN : FP_INFINITE;
 	return u.bits.m & (uint64_t)1<<63 ? FP_NORMAL : FP_NAN;