[PATCH 1/3] msvcrt: Don't set errno when calling trigonometric functions with NAN.
Alex Henrie
alexhenrie24 at gmail.com
Wed Jul 19 10:25:12 CDT 2017
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
dlls/msvcrt/math.c | 37 ++++++++++++++-----------------------
1 file changed, 14 insertions(+), 23 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index b030a63c4a..f3a53c917c 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -150,7 +150,7 @@ float CDECL MSVCRT__logbf( float num )
*/
float CDECL MSVCRT_acosf( float x )
{
- if (x < -1.0 || x > 1.0 || !finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < -1.0 || x > 1.0 || (!finitef(x) && !isnanf(x))) *MSVCRT__errno() = MSVCRT_EDOM;
/* glibc implements acos() as the FPU equivalent of atan2(sqrt(1 - x ^ 2), x).
* asin() uses a similar construction. This is bad because as x gets nearer to
* 1 the error in the expression "1 - x^2" can get relatively large due to
@@ -164,7 +164,7 @@ float CDECL MSVCRT_acosf( float x )
*/
float CDECL MSVCRT_asinf( float x )
{
- if (x < -1.0 || x > 1.0 || !finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < -1.0 || x > 1.0 || (!finitef(x) && !isnanf(x))) *MSVCRT__errno() = MSVCRT_EDOM;
return atan2f(x, sqrtf((1 - x) * (1 + x)));
}
@@ -173,7 +173,7 @@ float CDECL MSVCRT_asinf( float x )
*/
float CDECL MSVCRT_atanf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!finitef(x) && !isnanf(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atanf(x);
}
@@ -182,7 +182,6 @@ float CDECL MSVCRT_atanf( float x )
*/
float CDECL MSVCRT_atan2f( float x, float y )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atan2f(x,y);
}
@@ -191,7 +190,7 @@ float CDECL MSVCRT_atan2f( float x, float y )
*/
float CDECL MSVCRT_cosf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!finitef(x) && !isnanf(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return cosf(x);
}
@@ -200,7 +199,6 @@ float CDECL MSVCRT_cosf( float x )
*/
float CDECL MSVCRT_coshf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return coshf(x);
}
@@ -258,7 +256,7 @@ float CDECL MSVCRT_powf( float x, float y )
*/
float CDECL MSVCRT_sinf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!finitef(x) && !isnanf(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sinf(x);
}
@@ -267,7 +265,6 @@ float CDECL MSVCRT_sinf( float x )
*/
float CDECL MSVCRT_sinhf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sinhf(x);
}
@@ -285,7 +282,7 @@ float CDECL MSVCRT_sqrtf( float x )
*/
float CDECL MSVCRT_tanf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!finitef(x) && !isnanf(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return tanf(x);
}
@@ -294,7 +291,6 @@ float CDECL MSVCRT_tanf( float x )
*/
float CDECL MSVCRT_tanhf( float x )
{
- if (!finitef(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return tanhf(x);
}
@@ -345,7 +341,7 @@ float CDECL MSVCRT_modff( float x, float *iptr )
*/
double CDECL MSVCRT_acos( double x )
{
- if (x < -1.0 || x > 1.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < -1.0 || x > 1.0 || (!isfinite(x) && !isnan(x))) *MSVCRT__errno() = MSVCRT_EDOM;
/* glibc implements acos() as the FPU equivalent of atan2(sqrt(1 - x ^ 2), x).
* asin() uses a similar construction. This is bad because as x gets nearer to
* 1 the error in the expression "1 - x^2" can get relatively large due to
@@ -359,7 +355,7 @@ double CDECL MSVCRT_acos( double x )
*/
double CDECL MSVCRT_asin( double x )
{
- if (x < -1.0 || x > 1.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < -1.0 || x > 1.0 || (!isfinite(x) && !isnan(x))) *MSVCRT__errno() = MSVCRT_EDOM;
return atan2(x, sqrt((1 - x) * (1 + x)));
}
@@ -368,7 +364,6 @@ double CDECL MSVCRT_asin( double x )
*/
double CDECL MSVCRT_atan( double x )
{
- if (isnan(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atan(x);
}
@@ -377,7 +372,6 @@ double CDECL MSVCRT_atan( double x )
*/
double CDECL MSVCRT_atan2( double x, double y )
{
- if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atan2(x,y);
}
@@ -386,7 +380,7 @@ double CDECL MSVCRT_atan2( double x, double y )
*/
double CDECL MSVCRT_cos( double x )
{
- if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x) && !isnan(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return cos(x);
}
@@ -395,7 +389,6 @@ double CDECL MSVCRT_cos( double x )
*/
double CDECL MSVCRT_cosh( double x )
{
- if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return cosh(x);
}
@@ -453,7 +446,7 @@ double CDECL MSVCRT_pow( double x, double y )
*/
double CDECL MSVCRT_sin( double x )
{
- if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x) && !isnan(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sin(x);
}
@@ -462,7 +455,6 @@ double CDECL MSVCRT_sin( double x )
*/
double CDECL MSVCRT_sinh( double x )
{
- if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sinh(x);
}
@@ -480,7 +472,7 @@ double CDECL MSVCRT_sqrt( double x )
*/
double CDECL MSVCRT_tan( double x )
{
- if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x) && !isnan(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return tan(x);
}
@@ -489,7 +481,6 @@ double CDECL MSVCRT_tan( double x )
*/
double CDECL MSVCRT_tanh( double x )
{
- if (isnan(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return tanh(x);
}
@@ -3077,7 +3068,7 @@ double CDECL MSVCR120_atanh(double x)
else ret = (log(1+x) - log(1-x)) / 2;
#endif
- if (!isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ if (!isfinite(ret) && !isnan(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
return ret;
}
@@ -3087,7 +3078,7 @@ double CDECL MSVCR120_atanh(double x)
float CDECL MSVCR120_atanhf(float x)
{
#ifdef HAVE_ATANHF
- double ret;
+ float ret;
if (x > 1 || x < -1) {
MSVCRT_fenv_t env;
@@ -3102,7 +3093,7 @@ float CDECL MSVCR120_atanhf(float x)
ret = atanhf(x);
- if (!isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
+ if (!finitef(ret) && !isnanf(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
return ret;
#else
return MSVCR120_atanh(x);
--
2.13.3
More information about the wine-patches
mailing list