Blame lib/float+.h

Packit 33f14e
/* Supplemental information about the floating-point formats.
Packit 33f14e
   Copyright (C) 2007, 2009-2017 Free Software Foundation, Inc.
Packit 33f14e
   Written by Bruno Haible <bruno@clisp.org>, 2007.
Packit 33f14e
Packit 33f14e
   This program is free software; you can redistribute it and/or modify
Packit 33f14e
   it under the terms of the GNU General Public License as published by
Packit 33f14e
   the Free Software Foundation; either version 3, or (at your option)
Packit 33f14e
   any later version.
Packit 33f14e
Packit 33f14e
   This program is distributed in the hope that it will be useful,
Packit 33f14e
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
   GNU General Public License for more details.
Packit 33f14e
Packit 33f14e
   You should have received a copy of the GNU General Public License
Packit 33f14e
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit 33f14e
Packit 33f14e
#ifndef _FLOATPLUS_H
Packit 33f14e
#define _FLOATPLUS_H
Packit 33f14e
Packit 33f14e
#include <float.h>
Packit 33f14e
#include <limits.h>
Packit 33f14e
Packit 33f14e
/* Number of bits in the mantissa of a floating-point number, including the
Packit 33f14e
   "hidden bit".  */
Packit 33f14e
#if FLT_RADIX == 2
Packit 33f14e
# define FLT_MANT_BIT FLT_MANT_DIG
Packit 33f14e
# define DBL_MANT_BIT DBL_MANT_DIG
Packit 33f14e
# define LDBL_MANT_BIT LDBL_MANT_DIG
Packit 33f14e
#elif FLT_RADIX == 4
Packit 33f14e
# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
Packit 33f14e
# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
Packit 33f14e
# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
Packit 33f14e
#elif FLT_RADIX == 16
Packit 33f14e
# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
Packit 33f14e
# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
Packit 33f14e
# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
/* Bit mask that can be used to mask the exponent, as an unsigned number.  */
Packit 33f14e
#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
Packit 33f14e
#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
Packit 33f14e
#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
Packit 33f14e
Packit 33f14e
/* Number of bits used for the exponent of a floating-point number, including
Packit 33f14e
   the exponent's sign.  */
Packit 33f14e
#define FLT_EXP_BIT \
Packit 33f14e
  (FLT_EXP_MASK < 0x100 ? 8 : \
Packit 33f14e
   FLT_EXP_MASK < 0x200 ? 9 : \
Packit 33f14e
   FLT_EXP_MASK < 0x400 ? 10 : \
Packit 33f14e
   FLT_EXP_MASK < 0x800 ? 11 : \
Packit 33f14e
   FLT_EXP_MASK < 0x1000 ? 12 : \
Packit 33f14e
   FLT_EXP_MASK < 0x2000 ? 13 : \
Packit 33f14e
   FLT_EXP_MASK < 0x4000 ? 14 : \
Packit 33f14e
   FLT_EXP_MASK < 0x8000 ? 15 : \
Packit 33f14e
   FLT_EXP_MASK < 0x10000 ? 16 : \
Packit 33f14e
   FLT_EXP_MASK < 0x20000 ? 17 : \
Packit 33f14e
   FLT_EXP_MASK < 0x40000 ? 18 : \
Packit 33f14e
   FLT_EXP_MASK < 0x80000 ? 19 : \
Packit 33f14e
   FLT_EXP_MASK < 0x100000 ? 20 : \
Packit 33f14e
   FLT_EXP_MASK < 0x200000 ? 21 : \
Packit 33f14e
   FLT_EXP_MASK < 0x400000 ? 22 : \
Packit 33f14e
   FLT_EXP_MASK < 0x800000 ? 23 : \
Packit 33f14e
   FLT_EXP_MASK < 0x1000000 ? 24 : \
Packit 33f14e
   FLT_EXP_MASK < 0x2000000 ? 25 : \
Packit 33f14e
   FLT_EXP_MASK < 0x4000000 ? 26 : \
Packit 33f14e
   FLT_EXP_MASK < 0x8000000 ? 27 : \
Packit 33f14e
   FLT_EXP_MASK < 0x10000000 ? 28 : \
Packit 33f14e
   FLT_EXP_MASK < 0x20000000 ? 29 : \
Packit 33f14e
   FLT_EXP_MASK < 0x40000000 ? 30 : \
Packit 33f14e
   FLT_EXP_MASK <= 0x7fffffff ? 31 : \
Packit 33f14e
   32)
Packit 33f14e
#define DBL_EXP_BIT \
Packit 33f14e
  (DBL_EXP_MASK < 0x100 ? 8 : \
Packit 33f14e
   DBL_EXP_MASK < 0x200 ? 9 : \
Packit 33f14e
   DBL_EXP_MASK < 0x400 ? 10 : \
Packit 33f14e
   DBL_EXP_MASK < 0x800 ? 11 : \
Packit 33f14e
   DBL_EXP_MASK < 0x1000 ? 12 : \
Packit 33f14e
   DBL_EXP_MASK < 0x2000 ? 13 : \
Packit 33f14e
   DBL_EXP_MASK < 0x4000 ? 14 : \
Packit 33f14e
   DBL_EXP_MASK < 0x8000 ? 15 : \
Packit 33f14e
   DBL_EXP_MASK < 0x10000 ? 16 : \
Packit 33f14e
   DBL_EXP_MASK < 0x20000 ? 17 : \
Packit 33f14e
   DBL_EXP_MASK < 0x40000 ? 18 : \
Packit 33f14e
   DBL_EXP_MASK < 0x80000 ? 19 : \
Packit 33f14e
   DBL_EXP_MASK < 0x100000 ? 20 : \
Packit 33f14e
   DBL_EXP_MASK < 0x200000 ? 21 : \
Packit 33f14e
   DBL_EXP_MASK < 0x400000 ? 22 : \
Packit 33f14e
   DBL_EXP_MASK < 0x800000 ? 23 : \
Packit 33f14e
   DBL_EXP_MASK < 0x1000000 ? 24 : \
Packit 33f14e
   DBL_EXP_MASK < 0x2000000 ? 25 : \
Packit 33f14e
   DBL_EXP_MASK < 0x4000000 ? 26 : \
Packit 33f14e
   DBL_EXP_MASK < 0x8000000 ? 27 : \
Packit 33f14e
   DBL_EXP_MASK < 0x10000000 ? 28 : \
Packit 33f14e
   DBL_EXP_MASK < 0x20000000 ? 29 : \
Packit 33f14e
   DBL_EXP_MASK < 0x40000000 ? 30 : \
Packit 33f14e
   DBL_EXP_MASK <= 0x7fffffff ? 31 : \
Packit 33f14e
   32)
Packit 33f14e
#define LDBL_EXP_BIT \
Packit 33f14e
  (LDBL_EXP_MASK < 0x100 ? 8 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x200 ? 9 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x400 ? 10 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x800 ? 11 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x1000 ? 12 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x2000 ? 13 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x4000 ? 14 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x8000 ? 15 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x10000 ? 16 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x20000 ? 17 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x40000 ? 18 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x80000 ? 19 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x100000 ? 20 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x200000 ? 21 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x400000 ? 22 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x800000 ? 23 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x1000000 ? 24 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x2000000 ? 25 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x4000000 ? 26 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x8000000 ? 27 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x10000000 ? 28 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x20000000 ? 29 : \
Packit 33f14e
   LDBL_EXP_MASK < 0x40000000 ? 30 : \
Packit 33f14e
   LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
Packit 33f14e
   32)
Packit 33f14e
Packit 33f14e
/* Number of bits used for a floating-point number: the mantissa (not
Packit 33f14e
   counting the "hidden bit", since it may or may not be explicit), the
Packit 33f14e
   exponent, and the sign.  */
Packit 33f14e
#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
Packit 33f14e
#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
Packit 33f14e
#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
Packit 33f14e
Packit 33f14e
/* Number of bytes used for a floating-point number.
Packit 33f14e
   This can be smaller than the 'sizeof'.  For example, on i386 systems,
Packit 33f14e
   'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
Packit 33f14e
   LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
Packit 33f14e
   sizeof (long double) = 12 or = 16.  */
Packit 33f14e
#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
Packit 33f14e
#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
Packit 33f14e
#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
Packit 33f14e
Packit 33f14e
/* Verify that SIZEOF_FLT <= sizeof (float) etc.  */
Packit 33f14e
typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
Packit 33f14e
typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
Packit 33f14e
typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
Packit 33f14e
Packit 33f14e
#endif /* _FLOATPLUS_H */