(root)/
glibc-2.38/
stdlib/
fpioconst.h
       1  /* Header file for constants used in floating point <-> decimal conversions.
       2     Copyright (C) 1995-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifndef _FPIOCONST_H
      20  #define	_FPIOCONST_H
      21  
      22  #include <float.h>
      23  #include <math.h>
      24  #include <gmp.h>
      25  
      26  
      27  /* These values are used by __printf_fp, where they are noncritical (if the
      28     value is not large enough, it will just be slower); and by
      29     strtof/strtod/strtold, where it is critical (it's used for overflow
      30     detection).
      31  
      32     XXX These should be defined in <float.h>.  For the time being, we have the
      33     IEEE754 values here.  */
      34  
      35  #if !defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024
      36  # define LDBL_MAX_10_EXP_LOG	12 /* = floor(log_2(LDBL_MAX_10_EXP)) */
      37  #else
      38  # define LDBL_MAX_10_EXP_LOG	8 /* = floor(log_2(LDBL_MAX_10_EXP)) */
      39  #endif
      40  #define DBL_MAX_10_EXP_LOG	8 /* = floor(log_2(DBL_MAX_10_EXP)) */
      41  #define FLT_MAX_10_EXP_LOG	5 /* = floor(log_2(FLT_MAX_10_EXP)) */
      42  
      43  /* On some machines, _Float128 may be ABI-distinct from long double (e.g
      44     IBM extended precision).  */
      45  #include <bits/floatn.h>
      46  
      47  #if __HAVE_DISTINCT_FLOAT128
      48  # define FLT128_MAX_10_EXP_LOG	12 /* = floor(log_2(FLT128_MAX_10_EXP)) */
      49  #endif
      50  
      51  /* For strtold, we need powers of 10 up to floor (log_2 (LDBL_MANT_DIG
      52     - LDBL_MIN_EXP + 2)).  When _Float128 is enabled in libm and it is
      53     ABI-distinct from long double (e.g. on powerpc64le), we also need powers
      54     of 10 up to floor (log_2 (FLT128_MANT_DIG - FLT128_MIN_EXP + 2)).  */
      55  #if (!defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024) \
      56      || __HAVE_DISTINCT_FLOAT128
      57  # define FPIOCONST_HAVE_EXTENDED_RANGE 1
      58  #else
      59  # define FPIOCONST_HAVE_EXTENDED_RANGE 0
      60  #endif
      61  
      62  #if FPIOCONST_HAVE_EXTENDED_RANGE
      63  # define FPIOCONST_POW10_ARRAY_SIZE	15
      64  #else
      65  # define FPIOCONST_POW10_ARRAY_SIZE	11
      66  #endif
      67  
      68  /* The array with the number representation. */
      69  extern const mp_limb_t __tens[] attribute_hidden;
      70  
      71  /* Table of powers of ten.  This is used by __printf_fp and by
      72     strtof/strtod/strtold.  */
      73  struct mp_power
      74    {
      75      size_t arrayoff;		/* Offset in `__tens'.  */
      76      mp_size_t arraysize;	/* Size of the array.  */
      77      int p_expo;			/* Exponent of the number 10^(2^i).  */
      78      int m_expo;			/* Exponent of the number 10^-(2^i-1).  */
      79    };
      80  extern const struct mp_power _fpioconst_pow10[FPIOCONST_POW10_ARRAY_SIZE]
      81       attribute_hidden;
      82  
      83  /* The constants in the array `_fpioconst_pow10' have an offset.  */
      84  #if BITS_PER_MP_LIMB == 32
      85  # define _FPIO_CONST_OFFSET	2
      86  #else
      87  # define _FPIO_CONST_OFFSET	1
      88  #endif
      89  
      90  
      91  #endif	/* fpioconst.h */