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