<div dir="ltr"><div>- Fixed the problem of atan(INF)/tanh(INF)/exp(INF) causing errno EDOM</div><div>- Fixed the error of _copysign(1., -0.) returning 1</div><div><br></div><div>These patch fixes parts of these two bugs: 37149, 37150<br></div><div><br></div><div>---</div><div> dlls/msvcrt/math.c | 23 ++++++++++++-----------</div><div> 1 file changed, 12 insertions(+), 11 deletions(-)</div><div><br></div><div>diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c</div><div>index acac35d..155de47 100644</div><div>--- a/dlls/msvcrt/math.c</div><div>+++ b/dlls/msvcrt/math.c</div><div>@@ -88,10 +88,12 @@ float CDECL MSVCRT__chgsignf( float num )</div><div>  */</div><div> float CDECL MSVCRT__copysignf( float num, float sign )</div><div> {</div><div>-    /* FIXME: Behaviour for Nan/Inf? */</div><div>-    if (sign < 0.0)</div><div>-        return num < 0.0 ? num : -num;</div><div>-    return num < 0.0 ? -num : num;</div><div>+    /* FIXME: Behaviour for signbit(NAN) is different in Linux and</div><div>+     *        Windows, where Windows gives a zero for -NAN</div><div>+     */</div><div>+    if (signbit(sign))</div><div>+        return signbit(num) ? num : -num;</div><div>+    return signbit(num) ? -num : num;</div><div> }</div><div> </div><div> /*********************************************************************</div><div>@@ -363,7 +365,6 @@ double CDECL MSVCRT_asin( double x )</div><div>  */</div><div> double CDECL MSVCRT_atan( double x )</div><div> {</div><div>-  if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;</div><div>   return atan(x);</div><div> }</div><div> </div><div>@@ -399,7 +400,6 @@ double CDECL MSVCRT_cosh( double x )</div><div>  */</div><div> double CDECL MSVCRT_exp( double x )</div><div> {</div><div>-  if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;</div><div>   return exp(x);</div><div> }</div><div> </div><div>@@ -484,7 +484,6 @@ double CDECL MSVCRT_tan( double x )</div><div>  */</div><div> double CDECL MSVCRT_tanh( double x )</div><div> {</div><div>-  if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;</div><div>   return tanh(x);</div><div> }</div><div> </div><div>@@ -1227,10 +1226,12 @@ int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask</div><div>  */</div><div> double CDECL MSVCRT__copysign(double num, double sign)</div><div> {</div><div>-  /* FIXME: Behaviour for Nan/Inf? */</div><div>-  if (sign < 0.0)</div><div>-    return num < 0.0 ? num : -num;</div><div>-  return num < 0.0 ? -num : num;</div><div>+    /* FIXME: Behaviour for signbit(NAN) is different in Linux and</div><div>+     *        Windows, where Windows gives a zero for -NAN</div><div>+     */</div><div>+    if (signbit(sign))</div><div>+        return signbit(num) ? num : -num;</div><div>+    return signbit(num) ? -num : num;</div><div> }</div><div> </div><div> /*********************************************************************</div><div>-- </div><div>2.3.3</div></div>