msvcrt: Add INFINITY and NAN definitions to math.h.

Jacek Caban jacek at codeweavers.com
Fri Jan 10 08:48:17 CST 2014


Hi Francois,

On 01/10/14 15:29, Francois Gouget wrote:
> ---
>
> The INFINITY and NAN definitions have been added to math.h in recent 
> versions of msvcrt (i.e. they were not present in Visual C++ 2008 but 
> are in Visual C++ 2013). This means we have to provide them too 
> otherwise code that compiles with Visual C++ could fail to compile with 
> Winelib.
>
> To do so I'm just reusing the definition we have in wine/port.h.
>
> This definition bothers me a bit in that it clearly depends on the 
> in-memory representation of these floating point constants, which might 
> not be very portable (depending on whether the system uses IEEE 754 or 
> not, etc). In d3dx9_36 we used to define NAN as '0.0f / 0.0f'. Other 
> definitions would be variants like 'INFINITY * 0.0f', etc. I can't 
> really claim that those are really more portable and the compiler may 
> (and some do) complain about them. Hence why I went with the wine/port.h 
> definitions in the end. If they're good enough for port.h they should be 
> good for math.h too.
>
>
>  include/msvcrt/math.h | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/include/msvcrt/math.h b/include/msvcrt/math.h
> index 34aa268..42d6bfe 100644
> --- a/include/msvcrt/math.h
> +++ b/include/msvcrt/math.h
> @@ -146,6 +146,26 @@ static const union {
>  #  endif
>  #endif
>  
> +#ifndef INFINITY
> +/* From wine/port.h */
> +static inline float __port_infinity(void)
> +{
> +    static const unsigned __inf_bytes = 0x7f800000;
> +    return *(const float *)&__inf_bytes;
> +}
> +#define INFINITY __port_infinity()
> +#endif
> +
> +#ifndef NAN
> +/* From wine/port.h */
> +static inline float __port_nan(void)
> +{
> +    static const unsigned __nan_bytes = 0x7fc00000;
> +    return *(const float *)&__nan_bytes;
> +}
> +#define NAN __port_nan()
> +#endif
> +
>  #ifdef __cplusplus
>  }
>  #endif

In wine/port.h, we implement worst-case scenario where math.h doesn't
define NAN/INFINITY. In this case, since glibc/system math.h won't be
used and our msvcrt math.h will be included instead, we should try to
provide better NAN/INFINITY versions when possible. Looking at how it's
done in my Linux headers, there is __builtin_nanf() and __builtin_inff()
guarded by GCC >= 3.3 that we could use. How is it defined on MSVC?

Jacek



More information about the wine-devel mailing list