Zheng Chen : msvcrt: Fix _copysign bugs for NAN/INF.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 26 11:13:57 CDT 2015


Module: wine
Branch: master
Commit: 829e89318409d09701ba1d244e165685eb6dc830
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=829e89318409d09701ba1d244e165685eb6dc830

Author: Zheng Chen <ChanChengCC at gmail.com>
Date:   Tue Mar 24 09:51:12 2015 +0000

msvcrt: Fix _copysign bugs for NAN/INF.

---

 dlls/msvcrt/math.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 73f01aa..0cd69da 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -46,8 +46,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
 #endif
 #endif
 
+/* FIXME: Does not work with -NAN and -0. */
 #ifndef signbit
-#define signbit(x) 0
+#define signbit(x) ((x) < 0)
 #endif
 
 typedef int (CDECL *MSVCRT_matherr_func)(struct MSVCRT__exception *);
@@ -88,10 +89,9 @@ 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;
+    if (signbit(sign))
+        return signbit(num) ? num : -num;
+    return signbit(num) ? -num : num;
 }
 
 /*********************************************************************
@@ -1227,10 +1227,9 @@ 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;
+  if (signbit(sign))
+    return signbit(num) ? num : -num;
+  return signbit(num) ? -num : num;
 }
 
 /*********************************************************************




More information about the wine-cvs mailing list