[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