105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Supplemental information about the floating-point formats.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Written by Bruno Haible <bruno@clisp.org>, 2007.
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software; you can redistribute it and/or modify
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3, or (at your option)
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   any later version.
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _FLOATPLUS_H
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _FLOATPLUS_H
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <float.h>
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <limits.h>
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of bits in the mantissa of a floating-point number, including the
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   "hidden bit".  */
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if FLT_RADIX == 2
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define FLT_MANT_BIT FLT_MANT_DIG
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define DBL_MANT_BIT DBL_MANT_DIG
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MANT_BIT LDBL_MANT_DIG
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif FLT_RADIX == 4
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif FLT_RADIX == 16
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Bit mask that can be used to mask the exponent, as an unsigned number.  */
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of bits used for the exponent of a floating-point number, including
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the exponent's sign.  */
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define FLT_EXP_BIT \
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (FLT_EXP_MASK < 0x100 ? 8 : \
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x200 ? 9 : \
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x400 ? 10 : \
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x800 ? 11 : \
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x1000 ? 12 : \
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x2000 ? 13 : \
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x4000 ? 14 : \
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x8000 ? 15 : \
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x10000 ? 16 : \
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x20000 ? 17 : \
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x40000 ? 18 : \
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x80000 ? 19 : \
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x100000 ? 20 : \
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x200000 ? 21 : \
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x400000 ? 22 : \
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x800000 ? 23 : \
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x1000000 ? 24 : \
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x2000000 ? 25 : \
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x4000000 ? 26 : \
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x8000000 ? 27 : \
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x10000000 ? 28 : \
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x20000000 ? 29 : \
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK < 0x40000000 ? 30 : \
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   FLT_EXP_MASK <= 0x7fffffff ? 31 : \
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   32)
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define DBL_EXP_BIT \
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (DBL_EXP_MASK < 0x100 ? 8 : \
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x200 ? 9 : \
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x400 ? 10 : \
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x800 ? 11 : \
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x1000 ? 12 : \
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x2000 ? 13 : \
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x4000 ? 14 : \
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x8000 ? 15 : \
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x10000 ? 16 : \
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x20000 ? 17 : \
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x40000 ? 18 : \
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x80000 ? 19 : \
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x100000 ? 20 : \
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x200000 ? 21 : \
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x400000 ? 22 : \
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x800000 ? 23 : \
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x1000000 ? 24 : \
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x2000000 ? 25 : \
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x4000000 ? 26 : \
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x8000000 ? 27 : \
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x10000000 ? 28 : \
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x20000000 ? 29 : \
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK < 0x40000000 ? 30 : \
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   DBL_EXP_MASK <= 0x7fffffff ? 31 : \
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   32)
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define LDBL_EXP_BIT \
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (LDBL_EXP_MASK < 0x100 ? 8 : \
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x200 ? 9 : \
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x400 ? 10 : \
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x800 ? 11 : \
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x1000 ? 12 : \
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x2000 ? 13 : \
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x4000 ? 14 : \
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x8000 ? 15 : \
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x10000 ? 16 : \
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x20000 ? 17 : \
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x40000 ? 18 : \
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x80000 ? 19 : \
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x100000 ? 20 : \
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x200000 ? 21 : \
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x400000 ? 22 : \
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x800000 ? 23 : \
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x1000000 ? 24 : \
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x2000000 ? 25 : \
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x4000000 ? 26 : \
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x8000000 ? 27 : \
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x10000000 ? 28 : \
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x20000000 ? 29 : \
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK < 0x40000000 ? 30 : \
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   32)
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of bits used for a floating-point number: the mantissa (not
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   counting the "hidden bit", since it may or may not be explicit), the
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   exponent, and the sign.  */
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of bytes used for a floating-point number.
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This can be smaller than the 'sizeof'.  For example, on i386 systems,
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   sizeof (long double) = 12 or = 16.  */
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Verify that SIZEOF_FLT <= sizeof (float) etc.  */
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _FLOATPLUS_H */
148