msvcrt: Fix bugs in math.c

陈正 chanchengcc at gmail.com
Sun Mar 22 06:28:25 CDT 2015


- Fixed the problem of atan(INF)/tanh(INF)/exp(INF) causing errno EDOM
- Fixed the error of _copysign(1., -0.) returning 1

These patch fixes parts of these two bugs: 37149, 37150

---
 dlls/msvcrt/math.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index acac35d..155de47 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -88,10 +88,12 @@ float CDECL MSVCRT__chgsignf( float num )
  */
 float CDECL MSVCRT__copysignf( float num, float sign )
 {
-    /* FIXME: Behaviour for Nan/Inf? */
-    if (sign < 0.0)
-        return num < 0.0 ? num : -num;
-    return num < 0.0 ? -num : num;
+    /* FIXME: Behaviour for signbit(NAN) is different in Linux and
+     *        Windows, where Windows gives a zero for -NAN
+     */
+    if (signbit(sign))
+        return signbit(num) ? num : -num;
+    return signbit(num) ? -num : num;
 }

 /*********************************************************************
@@ -363,7 +365,6 @@ double CDECL MSVCRT_asin( double x )
  */
 double CDECL MSVCRT_atan( double x )
 {
-  if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
   return atan(x);
 }

@@ -399,7 +400,6 @@ double CDECL MSVCRT_cosh( double x )
  */
 double CDECL MSVCRT_exp( double x )
 {
-  if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
   return exp(x);
 }

@@ -484,7 +484,6 @@ double CDECL MSVCRT_tan( double x )
  */
 double CDECL MSVCRT_tanh( double x )
 {
-  if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
   return tanh(x);
 }

@@ -1227,10 +1226,12 @@ int CDECL _controlfp_s(unsigned int *cur, unsigned
int newval, unsigned int mask
  */
 double CDECL MSVCRT__copysign(double num, double sign)
 {
-  /* FIXME: Behaviour for Nan/Inf? */
-  if (sign < 0.0)
-    return num < 0.0 ? num : -num;
-  return num < 0.0 ? -num : num;
+    /* FIXME: Behaviour for signbit(NAN) is different in Linux and
+     *        Windows, where Windows gives a zero for -NAN
+     */
+    if (signbit(sign))
+        return signbit(num) ? num : -num;
+    return signbit(num) ? -num : num;
 }

 /*********************************************************************
-- 
2.3.3
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20150322/1cff330a/attachment.html>


More information about the wine-patches mailing list