msvcrt: fix _copysign(1., -0.) error

Kevin Chan chanchengcc at gmail.com
Sun Mar 22 08:51:13 CDT 2015


- Fixed the error of _copysign(1., -0.) returning 1

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

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

diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 19989c9..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;
 }

 /*********************************************************************
@@ -1224,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/99f168b4/attachment.html>


More information about the wine-patches mailing list