aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0004-math-fix-expf-NAN-and-exp2f-NAN-to-return-NAN-instea.patch
blob: e9eadc9718de9a68798bd095d99410048eb55122 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
From b023c03b574acdfd73418314a5dcaa83e5cea5a0 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <nsz@port70.net>
Date: Fri, 4 Mar 2016 21:23:33 +0000
Subject: [PATCH] math: fix expf(-NAN) and exp2f(-NAN) to return -NAN instead
 of 0

expf(-NAN) was treated as expf(-large) which unconditionally
returns +0, so special case +-NAN.
reported by Petr Hosek.
---
 src/math/exp2f.c | 2 ++
 src/math/expf.c  | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/src/math/exp2f.c b/src/math/exp2f.c
index cf6126e..296b634 100644
--- a/src/math/exp2f.c
+++ b/src/math/exp2f.c
@@ -91,6 +91,8 @@ float exp2f(float x)
 	/* Filter out exceptional cases. */
 	ix = u.i & 0x7fffffff;
 	if (ix > 0x42fc0000) {  /* |x| > 126 */
+		if (ix > 0x7f800000) /* NaN */
+			return x;
 		if (u.i >= 0x43000000 && u.i < 0x80000000) {  /* x >= 128 */
 			x *= 0x1p127f;
 			return x;
diff --git a/src/math/expf.c b/src/math/expf.c
index 16e9afe..feee2b0 100644
--- a/src/math/expf.c
+++ b/src/math/expf.c
@@ -39,6 +39,8 @@ float expf(float x)
 
 	/* special cases */
 	if (hx >= 0x42aeac50) {  /* if |x| >= -87.33655f or NaN */
+		if (hx > 0x7f800000) /* NaN */
+			return x;
 		if (hx >= 0x42b17218 && !sign) {  /* x >= 88.722839f */
 			/* overflow */
 			x *= 0x1p127f;
-- 
2.7.2