msvcrt: Fix _copysign bugs for NAN/INF.

This commit is contained in:
Zheng Chen 2015-03-24 09:51:12 +00:00 committed by Alexandre Julliard
parent b61d93a6b7
commit 829e893184
1 changed files with 8 additions and 9 deletions

View File

@ -46,8 +46,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
#endif #endif
#endif #endif
/* FIXME: Does not work with -NAN and -0. */
#ifndef signbit #ifndef signbit
#define signbit(x) 0 #define signbit(x) ((x) < 0)
#endif #endif
typedef int (CDECL *MSVCRT_matherr_func)(struct MSVCRT__exception *); 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 ) float CDECL MSVCRT__copysignf( float num, float sign )
{ {
/* FIXME: Behaviour for Nan/Inf? */ if (signbit(sign))
if (sign < 0.0) return signbit(num) ? num : -num;
return num < 0.0 ? num : -num; return signbit(num) ? -num : num;
return num < 0.0 ? -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) double CDECL MSVCRT__copysign(double num, double sign)
{ {
/* FIXME: Behaviour for Nan/Inf? */ if (signbit(sign))
if (sign < 0.0) return signbit(num) ? num : -num;
return num < 0.0 ? num : -num; return signbit(num) ? -num : num;
return num < 0.0 ? -num : num;
} }
/********************************************************************* /*********************************************************************