msvcrt: Fix _copysign bugs for NAN/INF
Zheng Chen
chanchengcc at gmail.com
Tue Mar 24 05:10:47 CDT 2015
---
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..d4b1794 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -46,8 +46,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
#endif
#endif
+/* FIXME: Doesnot 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;
}
/*********************************************************************
--
2.3.3
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20150324/220a7246/attachment.html>
More information about the wine-patches
mailing list