1193326Sed/*===---- float.h - Characteristics of floating point types ----------------===
2193326Sed *
3353358Sdim * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim * See https://llvm.org/LICENSE.txt for license information.
5353358Sdim * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6193326Sed *
7193326Sed *===-----------------------------------------------------------------------===
8193326Sed */
9193326Sed
10344779Sdim#ifndef __CLANG_FLOAT_H
11344779Sdim#define __CLANG_FLOAT_H
12193326Sed
13226633Sdim/* If we're on MinGW, fall back to the system's float.h, which might have
14224145Sdim * additional definitions provided for Windows.
15224145Sdim * For more details see http://msdn.microsoft.com/en-us/library/y0ybw9fy.aspx
16314564Sdim *
17314564Sdim * Also fall back on Darwin to allow additional definitions and
18314564Sdim * implementation-defined values.
19224145Sdim */
20314564Sdim#if (defined(__APPLE__) || (defined(__MINGW32__) || defined(_MSC_VER))) && \
21314564Sdim    __STDC_HOSTED__ && __has_include_next(<float.h>)
22322320Sdim
23322320Sdim/* Prior to Apple's 10.7 SDK, float.h SDK header used to apply an extra level
24322320Sdim * of #include_next<float.h> to keep Metrowerks compilers happy. Avoid this
25322320Sdim * extra indirection.
26322320Sdim */
27322320Sdim#ifdef __APPLE__
28322320Sdim#define _FLOAT_H_
29322320Sdim#endif
30322320Sdim
31224145Sdim#  include_next <float.h>
32224145Sdim
33224145Sdim/* Undefine anything that we'll be redefining below. */
34224145Sdim#  undef FLT_EVAL_METHOD
35224145Sdim#  undef FLT_ROUNDS
36224145Sdim#  undef FLT_RADIX
37224145Sdim#  undef FLT_MANT_DIG
38224145Sdim#  undef DBL_MANT_DIG
39224145Sdim#  undef LDBL_MANT_DIG
40353358Sdim#  if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__) || __cplusplus >= 201103L
41309124Sdim#    undef DECIMAL_DIG
42309124Sdim#  endif
43224145Sdim#  undef FLT_DIG
44224145Sdim#  undef DBL_DIG
45224145Sdim#  undef LDBL_DIG
46224145Sdim#  undef FLT_MIN_EXP
47224145Sdim#  undef DBL_MIN_EXP
48224145Sdim#  undef LDBL_MIN_EXP
49224145Sdim#  undef FLT_MIN_10_EXP
50224145Sdim#  undef DBL_MIN_10_EXP
51224145Sdim#  undef LDBL_MIN_10_EXP
52224145Sdim#  undef FLT_MAX_EXP
53224145Sdim#  undef DBL_MAX_EXP
54224145Sdim#  undef LDBL_MAX_EXP
55224145Sdim#  undef FLT_MAX_10_EXP
56224145Sdim#  undef DBL_MAX_10_EXP
57224145Sdim#  undef LDBL_MAX_10_EXP
58224145Sdim#  undef FLT_MAX
59224145Sdim#  undef DBL_MAX
60224145Sdim#  undef LDBL_MAX
61224145Sdim#  undef FLT_EPSILON
62224145Sdim#  undef DBL_EPSILON
63224145Sdim#  undef LDBL_EPSILON
64224145Sdim#  undef FLT_MIN
65224145Sdim#  undef DBL_MIN
66224145Sdim#  undef LDBL_MIN
67353358Sdim#  if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__) || __cplusplus >= 201703L
68234353Sdim#    undef FLT_TRUE_MIN
69234353Sdim#    undef DBL_TRUE_MIN
70234353Sdim#    undef LDBL_TRUE_MIN
71309124Sdim#    undef FLT_DECIMAL_DIG
72309124Sdim#    undef DBL_DECIMAL_DIG
73309124Sdim#    undef LDBL_DECIMAL_DIG
74344779Sdim#    undef FLT_HAS_SUBNORM
75344779Sdim#    undef DBL_HAS_SUBNORM
76344779Sdim#    undef LDBL_HAS_SUBNORM
77234353Sdim#  endif
78224145Sdim#endif
79224145Sdim
80193326Sed/* Characteristics of floating point types, C99 5.2.4.2.2 */
81193326Sed
82193326Sed#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
83193326Sed#define FLT_ROUNDS (__builtin_flt_rounds())
84193326Sed#define FLT_RADIX __FLT_RADIX__
85193326Sed
86193326Sed#define FLT_MANT_DIG __FLT_MANT_DIG__
87193326Sed#define DBL_MANT_DIG __DBL_MANT_DIG__
88193326Sed#define LDBL_MANT_DIG __LDBL_MANT_DIG__
89193326Sed
90353358Sdim#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__) || __cplusplus >= 201103L
91309124Sdim#  define DECIMAL_DIG __DECIMAL_DIG__
92309124Sdim#endif
93193326Sed
94193326Sed#define FLT_DIG __FLT_DIG__
95193326Sed#define DBL_DIG __DBL_DIG__
96193326Sed#define LDBL_DIG __LDBL_DIG__
97193326Sed
98193326Sed#define FLT_MIN_EXP __FLT_MIN_EXP__
99193326Sed#define DBL_MIN_EXP __DBL_MIN_EXP__
100193326Sed#define LDBL_MIN_EXP __LDBL_MIN_EXP__
101193326Sed
102193326Sed#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
103193326Sed#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
104193326Sed#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
105193326Sed
106193326Sed#define FLT_MAX_EXP __FLT_MAX_EXP__
107193326Sed#define DBL_MAX_EXP __DBL_MAX_EXP__
108193326Sed#define LDBL_MAX_EXP __LDBL_MAX_EXP__
109193326Sed
110193326Sed#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
111193326Sed#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
112193326Sed#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
113193326Sed
114193326Sed#define FLT_MAX __FLT_MAX__
115193326Sed#define DBL_MAX __DBL_MAX__
116193326Sed#define LDBL_MAX __LDBL_MAX__
117193326Sed
118193326Sed#define FLT_EPSILON __FLT_EPSILON__
119193326Sed#define DBL_EPSILON __DBL_EPSILON__
120193326Sed#define LDBL_EPSILON __LDBL_EPSILON__
121193326Sed
122193326Sed#define FLT_MIN __FLT_MIN__
123193326Sed#define DBL_MIN __DBL_MIN__
124193326Sed#define LDBL_MIN __LDBL_MIN__
125193326Sed
126353358Sdim#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__) || __cplusplus >= 201703L
127234353Sdim#  define FLT_TRUE_MIN __FLT_DENORM_MIN__
128234353Sdim#  define DBL_TRUE_MIN __DBL_DENORM_MIN__
129234353Sdim#  define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
130309124Sdim#  define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__
131309124Sdim#  define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
132309124Sdim#  define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__
133344779Sdim#  define FLT_HAS_SUBNORM __FLT_HAS_DENORM__
134344779Sdim#  define DBL_HAS_SUBNORM __DBL_HAS_DENORM__
135344779Sdim#  define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__
136234353Sdim#endif
137234353Sdim
138327952Sdim#ifdef __STDC_WANT_IEC_60559_TYPES_EXT__
139327952Sdim#  define FLT16_MANT_DIG    __FLT16_MANT_DIG__
140327952Sdim#  define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__
141327952Sdim#  define FLT16_DIG         __FLT16_DIG__
142327952Sdim#  define FLT16_MIN_EXP     __FLT16_MIN_EXP__
143327952Sdim#  define FLT16_MIN_10_EXP  __FLT16_MIN_10_EXP__
144327952Sdim#  define FLT16_MAX_EXP     __FLT16_MAX_EXP__
145327952Sdim#  define FLT16_MAX_10_EXP  __FLT16_MAX_10_EXP__
146327952Sdim#  define FLT16_MAX         __FLT16_MAX__
147327952Sdim#  define FLT16_EPSILON     __FLT16_EPSILON__
148327952Sdim#  define FLT16_MIN         __FLT16_MIN__
149327952Sdim#  define FLT16_TRUE_MIN    __FLT16_TRUE_MIN__
150327952Sdim#endif /* __STDC_WANT_IEC_60559_TYPES_EXT__ */
151327952Sdim
152344779Sdim#endif /* __CLANG_FLOAT_H */
153