zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

float.h (6583B) - Raw


      1 /*===---- float.h - Characteristics of floating point types ----------------===
      2  *
      3  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  * See https://llvm.org/LICENSE.txt for license information.
      5  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  *
      7  *===-----------------------------------------------------------------------===
      8  */
      9 
     10 #ifndef __CLANG_FLOAT_H
     11 #define __CLANG_FLOAT_H
     12 
     13 #if defined(__MVS__) && __has_include_next(<float.h>)
     14 #include_next <float.h>
     15 #else
     16 
     17 /* If we're on MinGW, fall back to the system's float.h, which might have
     18  * additional definitions provided for Windows.
     19  * For more details see http://msdn.microsoft.com/en-us/library/y0ybw9fy.aspx
     20  *
     21  * Also fall back on Darwin and AIX to allow additional definitions and
     22  * implementation-defined values.
     23  */
     24 #if (defined(__APPLE__) || defined(__MINGW32__) || defined(_MSC_VER) ||        \
     25      defined(_AIX)) &&                                                         \
     26     __STDC_HOSTED__ && __has_include_next(<float.h>)
     27 
     28 /* Prior to Apple's 10.7 SDK, float.h SDK header used to apply an extra level
     29  * of #include_next<float.h> to keep Metrowerks compilers happy. Avoid this
     30  * extra indirection.
     31  */
     32 #ifdef __APPLE__
     33 #define _FLOAT_H_
     34 #endif
     35 
     36 #  include_next <float.h>
     37 
     38 /* Undefine anything that we'll be redefining below. */
     39 #  undef FLT_EVAL_METHOD
     40 #  undef FLT_ROUNDS
     41 #  undef FLT_RADIX
     42 #  undef FLT_MANT_DIG
     43 #  undef DBL_MANT_DIG
     44 #  undef LDBL_MANT_DIG
     45 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) ||              \
     46     !defined(__STRICT_ANSI__) ||                                               \
     47     (defined(__cplusplus) && __cplusplus >= 201103L) ||                        \
     48     (__STDC_HOSTED__ && defined(_AIX) && defined(_ALL_SOURCE))
     49 #    undef DECIMAL_DIG
     50 #  endif
     51 #  undef FLT_DIG
     52 #  undef DBL_DIG
     53 #  undef LDBL_DIG
     54 #  undef FLT_MIN_EXP
     55 #  undef DBL_MIN_EXP
     56 #  undef LDBL_MIN_EXP
     57 #  undef FLT_MIN_10_EXP
     58 #  undef DBL_MIN_10_EXP
     59 #  undef LDBL_MIN_10_EXP
     60 #  undef FLT_MAX_EXP
     61 #  undef DBL_MAX_EXP
     62 #  undef LDBL_MAX_EXP
     63 #  undef FLT_MAX_10_EXP
     64 #  undef DBL_MAX_10_EXP
     65 #  undef LDBL_MAX_10_EXP
     66 #  undef FLT_MAX
     67 #  undef DBL_MAX
     68 #  undef LDBL_MAX
     69 #  undef FLT_EPSILON
     70 #  undef DBL_EPSILON
     71 #  undef LDBL_EPSILON
     72 #  undef FLT_MIN
     73 #  undef DBL_MIN
     74 #  undef LDBL_MIN
     75 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) ||              \
     76     !defined(__STRICT_ANSI__) ||                                               \
     77     (defined(__cplusplus) && __cplusplus >= 201703L) ||                        \
     78     (__STDC_HOSTED__ && defined(_AIX) && defined(_ALL_SOURCE))
     79 #    undef FLT_TRUE_MIN
     80 #    undef DBL_TRUE_MIN
     81 #    undef LDBL_TRUE_MIN
     82 #    undef FLT_DECIMAL_DIG
     83 #    undef DBL_DECIMAL_DIG
     84 #    undef LDBL_DECIMAL_DIG
     85 #    undef FLT_HAS_SUBNORM
     86 #    undef DBL_HAS_SUBNORM
     87 #    undef LDBL_HAS_SUBNORM
     88 #  endif
     89 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) ||              \
     90     !defined(__STRICT_ANSI__)
     91 #    undef FLT_NORM_MAX
     92 #    undef DBL_NORM_MAX
     93 #    undef LDBL_NORM_MAX
     94 #endif
     95 #endif
     96 
     97 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) ||              \
     98     !defined(__STRICT_ANSI__)
     99 #  undef INFINITY
    100 #  undef NAN
    101 #endif
    102 
    103 /* Characteristics of floating point types, C99 5.2.4.2.2 */
    104 
    105 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) ||              \
    106     (defined(__cplusplus) && __cplusplus >= 201103L)
    107 #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
    108 #endif
    109 #define FLT_ROUNDS (__builtin_flt_rounds())
    110 #define FLT_RADIX __FLT_RADIX__
    111 
    112 #define FLT_MANT_DIG __FLT_MANT_DIG__
    113 #define DBL_MANT_DIG __DBL_MANT_DIG__
    114 #define LDBL_MANT_DIG __LDBL_MANT_DIG__
    115 
    116 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) ||              \
    117     !defined(__STRICT_ANSI__) ||                                               \
    118     (defined(__cplusplus) && __cplusplus >= 201103L) ||                        \
    119     (__STDC_HOSTED__ && defined(_AIX) && defined(_ALL_SOURCE))
    120 #  define DECIMAL_DIG __DECIMAL_DIG__
    121 #endif
    122 
    123 #define FLT_DIG __FLT_DIG__
    124 #define DBL_DIG __DBL_DIG__
    125 #define LDBL_DIG __LDBL_DIG__
    126 
    127 #define FLT_MIN_EXP __FLT_MIN_EXP__
    128 #define DBL_MIN_EXP __DBL_MIN_EXP__
    129 #define LDBL_MIN_EXP __LDBL_MIN_EXP__
    130 
    131 #define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
    132 #define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
    133 #define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
    134 
    135 #define FLT_MAX_EXP __FLT_MAX_EXP__
    136 #define DBL_MAX_EXP __DBL_MAX_EXP__
    137 #define LDBL_MAX_EXP __LDBL_MAX_EXP__
    138 
    139 #define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
    140 #define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
    141 #define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
    142 
    143 #define FLT_MAX __FLT_MAX__
    144 #define DBL_MAX __DBL_MAX__
    145 #define LDBL_MAX __LDBL_MAX__
    146 
    147 #define FLT_EPSILON __FLT_EPSILON__
    148 #define DBL_EPSILON __DBL_EPSILON__
    149 #define LDBL_EPSILON __LDBL_EPSILON__
    150 
    151 #define FLT_MIN __FLT_MIN__
    152 #define DBL_MIN __DBL_MIN__
    153 #define LDBL_MIN __LDBL_MIN__
    154 
    155 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) ||              \
    156     !defined(__STRICT_ANSI__) ||                                               \
    157     (defined(__cplusplus) && __cplusplus >= 201703L) ||                        \
    158     (__STDC_HOSTED__ && defined(_AIX) && defined(_ALL_SOURCE))
    159 #  define FLT_TRUE_MIN __FLT_DENORM_MIN__
    160 #  define DBL_TRUE_MIN __DBL_DENORM_MIN__
    161 #  define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
    162 #  define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__
    163 #  define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
    164 #  define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__
    165 #  define FLT_HAS_SUBNORM __FLT_HAS_DENORM__
    166 #  define DBL_HAS_SUBNORM __DBL_HAS_DENORM__
    167 #  define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__
    168 #endif
    169 
    170 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) ||              \
    171     !defined(__STRICT_ANSI__)
    172    /* C23 5.2.5.3.3p29-30 */
    173 #  define INFINITY (__builtin_inff())
    174 #  define NAN (__builtin_nanf(""))
    175    /* C23 5.2.5.3.3p32 */
    176 #  define FLT_NORM_MAX __FLT_NORM_MAX__
    177 #  define DBL_NORM_MAX __DBL_NORM_MAX__
    178 #  define LDBL_NORM_MAX __LDBL_NORM_MAX__
    179 #endif
    180 
    181 #ifdef __STDC_WANT_IEC_60559_TYPES_EXT__
    182 #  define FLT16_MANT_DIG    __FLT16_MANT_DIG__
    183 #  define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__
    184 #  define FLT16_DIG         __FLT16_DIG__
    185 #  define FLT16_MIN_EXP     __FLT16_MIN_EXP__
    186 #  define FLT16_MIN_10_EXP  __FLT16_MIN_10_EXP__
    187 #  define FLT16_MAX_EXP     __FLT16_MAX_EXP__
    188 #  define FLT16_MAX_10_EXP  __FLT16_MAX_10_EXP__
    189 #  define FLT16_MAX         __FLT16_MAX__
    190 #  define FLT16_EPSILON     __FLT16_EPSILON__
    191 #  define FLT16_MIN         __FLT16_MIN__
    192 #  define FLT16_TRUE_MIN    __FLT16_TRUE_MIN__
    193 #endif /* __STDC_WANT_IEC_60559_TYPES_EXT__ */
    194 
    195 #endif /* __MVS__ */
    196 #endif /* __CLANG_FLOAT_H */