[PATCH 2/3] msvcrt: Set ERANGE in exp functions on finite input and infinite output.
Alex Henrie
alexhenrie24 at gmail.com
Wed Jul 19 10:25:13 CDT 2017
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
dlls/msvcrt/math.c | 36 ++++++++++++++++++++----------------
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index f3a53c917c..9cdaec7c60 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -207,8 +207,9 @@ float CDECL MSVCRT_coshf( float x )
*/
float CDECL MSVCRT_expf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
- return expf(x);
+ float ret = expf(x);
+ if (finitef(x) && !finitef(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ return ret;
}
/*********************************************************************
@@ -397,8 +398,9 @@ double CDECL MSVCRT_cosh( double x )
*/
double CDECL MSVCRT_exp( double x )
{
- if (isnan(x)) *MSVCRT__errno() = MSVCRT_EDOM;
- return exp(x);
+ double ret = exp(x);
+ if (isfinite(x) && !isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ return ret;
}
/*********************************************************************
@@ -975,7 +977,7 @@ double CDECL MSVCRT_ldexp(double num, MSVCRT_long exp)
{
double z = ldexp(num,exp);
- if (!isfinite(z))
+ if (isfinite(num) && !isfinite(z))
*MSVCRT__errno() = MSVCRT_ERANGE;
else if (z == 0 && signbit(z))
z = 0.0; /* Convert -0 -> +0 */
@@ -2376,10 +2378,12 @@ LDOUBLE CDECL MSVCR120_cbrtl(LDOUBLE x)
double CDECL MSVCR120_exp2(double x)
{
#ifdef HAVE_EXP2
- return exp2(x);
+ double ret = exp2(x);
#else
- return pow(2, x);
+ double ret = pow(2, x);
#endif
+ if (isfinite(x) && !isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ return ret;
}
/*********************************************************************
@@ -2388,7 +2392,9 @@ double CDECL MSVCR120_exp2(double x)
float CDECL MSVCR120_exp2f(float x)
{
#ifdef HAVE_EXP2F
- return exp2f(x);
+ float ret = exp2f(x);
+ if (finitef(x) && !finitef(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ return ret;
#else
return MSVCR120_exp2(x);
#endif
@@ -2412,7 +2418,7 @@ double CDECL MSVCR120_expm1(double x)
#else
double ret = exp(x) - 1;
#endif
- if (!isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ if (isfinite(x) && !isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
return ret;
}
@@ -2422,11 +2428,11 @@ double CDECL MSVCR120_expm1(double x)
float CDECL MSVCR120_expm1f(float x)
{
#ifdef HAVE_EXPM1F
- double ret = expm1f(x);
+ float ret = expm1f(x);
#else
- double ret = exp(x) - 1;
+ float ret = exp(x) - 1;
#endif
- if (!isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ if (finitef(x) && !finitef(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
return ret;
}
@@ -3115,8 +3121,7 @@ LDOUBLE CDECL MSVCR120_atanhl(LDOUBLE x)
*/
double CDECL MSVCRT__scalb(double num, MSVCRT_long power)
{
- if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
- return ldexp(num, power);
+ return MSVCRT_ldexp(num, power);
}
/*********************************************************************
@@ -3126,8 +3131,7 @@ double CDECL MSVCRT__scalb(double num, MSVCRT_long power)
*/
float CDECL MSVCRT__scalbf(float num, MSVCRT_long power)
{
- if (!finitef(num)) *MSVCRT__errno() = MSVCRT_EDOM;
- return ldexpf(num, power);
+ return MSVCRT_ldexp(num, power);
}
/*********************************************************************
--
2.13.3
More information about the wine-patches
mailing list