decNumber.h revision 302408
197521Sphk/* Decimal Number module header for the decNumber C Library 297521Sphk Copyright (C) 2005 Free Software Foundation, Inc. 397521Sphk Contributed by IBM Corporation. Author Mike Cowlishaw. 4139815Simp 5139815Simp This file is part of GCC. 6139815Simp 797521Sphk GCC is free software; you can redistribute it and/or modify it under 897521Sphk the terms of the GNU General Public License as published by the Free 997521Sphk Software Foundation; either version 2, or (at your option) any later 1097521Sphk version. 1197521Sphk 1297521Sphk In addition to the permissions in the GNU General Public License, 1397521Sphk the Free Software Foundation gives you unlimited permission to link 1497521Sphk the compiled version of this file into combinations with other 1597521Sphk programs, and to distribute those combinations without any 1697521Sphk restriction coming from the use of this file. (The General Public 1797521Sphk License restrictions do apply in other respects; for example, they 1897521Sphk cover modification of the file, and distribution when not linked 1997521Sphk into a combine executable.) 2097521Sphk 2197521Sphk GCC is distributed in the hope that it will be useful, but WITHOUT ANY 2297521Sphk WARRANTY; without even the implied warranty of MERCHANTABILITY or 2397521Sphk FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2497521Sphk for more details. 2597521Sphk 2697521Sphk You should have received a copy of the GNU General Public License 2797521Sphk along with GCC; see the file COPYING. If not, write to the Free 2897521Sphk Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 2997521Sphk 02110-1301, USA. */ 3097521Sphk 3197521Sphk#if !defined(DECNUMBER) 3297521Sphk#define DECNUMBER 3397521Sphk#define DECNAME "decNumber" /* Short name */ 3497521Sphk#define DECVERSION "decNumber 3.24" /* Version [16 max.] */ 3597521Sphk#define DECFULLNAME "Decimal Number Module" /* Verbose name */ 3697521Sphk#define DECAUTHOR "Mike Cowlishaw" /* Who to blame */ 3797521Sphk 3897521Sphk#if !defined(DECCONTEXT) 3997521Sphk#include "decContext.h" 4097521Sphk#endif 4197521Sphk 4297521Sphk 4397521Sphk /* Bit settings for decNumber.bits */ 4497521Sphk#define DECNEG 0x80 /* Sign; 1=negative, 0=positive or zero */ 45116189Sobrien#define DECINF 0x40 /* 1=Infinity */ 46116189Sobrien#define DECNAN 0x20 /* 1=NaN */ 47116189Sobrien#define DECSNAN 0x10 /* 1=sNaN */ 4897521Sphk /* The remaining bits are reserved; they must be 0 */ 4997521Sphk#define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value */ 5097521Sphk 51233517Smarius /* DECNUMDIGITS is the default number of digits we can hold in the */ 5297521Sphk /* structure. If undefined, 1 is assumed and it is assumed that the */ 5397521Sphk /* structure will be immediately followed by extra space (if */ 5497521Sphk /* required). DECNUMDIGITS is always >0. */ 5597521Sphk#if !defined(DECNUMDIGITS) 5697521Sphk#define DECNUMDIGITS 1 5797521Sphk#endif 5897521Sphk 5997521Sphk 6097521Sphk /* Define the decNumber data structure. The size and shape of the */ 6197521Sphk /* units array in the structure is determined by the following */ 6297521Sphk /* constant. This must not be changed without recompiling the */ 6397521Sphk /* decNumber library modules. */ 6497521Sphk#define DECDPUN 4 /* Decimal Digits Per UNit [must be in */ 6597521Sphk /* range 1-9; power of 2 recommended]. */ 6697521Sphk /* The size (integer data type) of each unit is determined by the */ 6797521Sphk /* number of digits it will hold. */ 6897521Sphk#if DECDPUN<=2 6997521Sphk#define decNumberUnit uint8_t 7097521Sphk#elif DECDPUN<=4 7197521Sphk#define decNumberUnit uint16_t 7297521Sphk#else 7397521Sphk#define decNumberUnit uint32_t 7497521Sphk#endif 7597521Sphk /* The number of decNumberUnits we need is ceiling of DECNUMDIGITS/DECDPUN */ 7697521Sphk#define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN) 7797521Sphk 7897521Sphk /* The data structure... */ 7997521Sphktypedef struct 8097521Sphk{ 8197521Sphk int32_t digits; /* Count of digits in the coefficient; >0 */ 8297521Sphk int32_t exponent; /* Unadjusted exponent, unbiased, in */ 8397521Sphk /* range: -1999999997 through 999999999 */ 8497521Sphk uint8_t bits; /* Indicator bits (see above) */ 8597521Sphk decNumberUnit lsu[DECNUMUNITS]; /* Coefficient, from least significant unit */ 8697521Sphk} decNumber; 8797521Sphk 8897521Sphk /* Notes: */ 8997521Sphk /* 1. If digits is > DECDPUN then there will be more than one */ 9097521Sphk /* decNumberUnits immediately following the first element of lsu. */ 9197521Sphk /* These contain the remaining (more significant) digits of the */ 9297521Sphk /* number, and may be in the lsu array, or may be guaranteed by */ 9397521Sphk /* some other mechanism (such as being contained in another */ 9497521Sphk /* structure, or being overlaid on dynamically allocated storage). */ 9597521Sphk /* */ 9697521Sphk /* Each integer of the coefficient (except the possibly the last) */ 97145604Smarcel /* contains DECDPUN digits (e.g., a value in the range 0 through */ 98145604Smarcel /* 99999999 if DECDPUN is 8, or 0 through 9999 if DECDPUN is 4). */ 99145604Smarcel /* */ 100145604Smarcel /* 2. A decNumber converted to a string may need up to digits+14 */ 101145611Smarcel /* characters. The worst cases (non-exponential and exponential */ 102145604Smarcel /* formats) are: -0.00000{9...}# */ 103145604Smarcel /* and: -9.{9...}E+999999999# (where # is '\0') */ 104145604Smarcel 105145604Smarcel 106145604Smarcel /* ------------------------------------------------------------------ */ 107145604Smarcel /* decNumber public functions and macros */ 108145604Smarcel /* ------------------------------------------------------------------ */ 109145604Smarcel 110145604Smarcel#ifdef IN_LIBGCC2 111145604Smarcel#define decNumberFromString __decNumberFromString 112145604Smarcel#define decNumberToString __decNumberToString 113145604Smarcel#define decNumberToEngString __decNumberToEngString 114145604Smarcel#define decNumberAbs __decNumberAbs 115188605Srrs#define decNumberAdd __decNumberAdd 116188605Srrs#define decNumberCompare __decNumberCompare 117188605Srrs#define decNumberDivide __decNumberDivide 118188605Srrs#define decNumberDivideInteger __decNumberDivideInteger 119188605Srrs#define decNumberMax __decNumberMax 120188605Srrs#define decNumberMin __decNumberMin 121188605Srrs#define decNumberMinus __decNumberMinus 122188605Srrs#define decNumberMultiply __decNumberMultiply 123188605Srrs#define decNumberNormalize __decNumberNormalize 124188605Srrs#define decNumberPlus __decNumberPlus 125188605Srrs#define decNumberPower __decNumberPower 126188605Srrs#define decNumberQuantize __decNumberQuantize 127188605Srrs#define decNumberRemainder __decNumberRemainder 128188605Srrs#define decNumberRemainderNear __decNumberRemainderNear 129188605Srrs#define decNumberRescale __decNumberRescale 130188605Srrs#define decNumberSameQuantum __decNumberSameQuantum 131188605Srrs#define decNumberSquareRoot __decNumberSquareRoot 132188605Srrs#define decNumberSubtract __decNumberSubtract 133188605Srrs#define decNumberToIntegralValue __decNumberToIntegralValue 134188605Srrs#define decNumberCopy __decNumberCopy 135188605Srrs#define decNumberTrim __decNumberTrim 136188605Srrs#define decNumberVersion __decNumberVersion 137233517Smarius#define decNumberZero __decNumberZero 138188605Srrs#endif 139188605Srrs 140188605Srrs /* Conversions */ 141188605SrrsdecNumber *decNumberFromString (decNumber *, const char *, decContext *); 142188605Srrschar *decNumberToString (const decNumber *, char *); 143188605Srrschar *decNumberToEngString (const decNumber *, char *); 144188605Srrs 145188605Srrs /* Operators */ 146188605SrrsdecNumber *decNumberAbs (decNumber *, const decNumber *, decContext *); 147188605SrrsdecNumber *decNumberAdd (decNumber *, const decNumber *, 148188605Srrs const decNumber *, decContext *); 149188605SrrsdecNumber *decNumberCompare (decNumber *, const decNumber *, 150188605Srrs const decNumber *, decContext *); 151188605SrrsdecNumber *decNumberDivide (decNumber *, const decNumber *, 152188605Srrs const decNumber *, decContext *); 153188605SrrsdecNumber *decNumberDivideInteger (decNumber *, const decNumber *, 154188605Srrs const decNumber *, decContext *); 155188605SrrsdecNumber *decNumberMax (decNumber *, const decNumber *, 156188605Srrs const decNumber *, decContext *); 157188605SrrsdecNumber *decNumberMin (decNumber *, const decNumber *, 158188605Srrs const decNumber *, decContext *); 159188605SrrsdecNumber *decNumberMinus (decNumber *, const decNumber *, decContext *); 160188605SrrsdecNumber *decNumberMultiply (decNumber *, const decNumber *, 161188605Srrs const decNumber *, decContext *); 162188605SrrsdecNumber *decNumberNormalize (decNumber *, const decNumber *, decContext *); 163188605SrrsdecNumber *decNumberPlus (decNumber *, const decNumber *, decContext *); 164188605SrrsdecNumber *decNumberPower (decNumber *, const decNumber *, 165188605Srrs const decNumber *, decContext *); 166188605SrrsdecNumber *decNumberQuantize (decNumber *, const decNumber *, 167188605Srrs const decNumber *, decContext *); 168188605SrrsdecNumber *decNumberRemainder (decNumber *, const decNumber *, 169188605Srrs const decNumber *, decContext *); 170188605SrrsdecNumber *decNumberRemainderNear (decNumber *, const decNumber *, 171188605Srrs const decNumber *, decContext *); 172188605SrrsdecNumber *decNumberRescale (decNumber *, const decNumber *, 173188605Srrs const decNumber *, decContext *); 174188605SrrsdecNumber *decNumberSameQuantum (decNumber *, const decNumber *, const decNumber *); 175188605SrrsdecNumber *decNumberSquareRoot (decNumber *, const decNumber *, decContext *); 176188605SrrsdecNumber *decNumberSubtract (decNumber *, const decNumber *, 177188605Srrs const decNumber *, decContext *); 178188605SrrsdecNumber *decNumberToIntegralValue (decNumber *, const decNumber *, decContext *); 179188605Srrs 180188605Srrs /* Utilities */ 181188605SrrsdecNumber *decNumberCopy (decNumber *, const decNumber *); 182188605SrrsdecNumber *decNumberTrim (decNumber *); 183188605Srrsconst char *decNumberVersion (void); 184188605SrrsdecNumber *decNumberZero (decNumber *); 185188605Srrs 186188605Srrs /* Macros */ 187188605Srrs#define decNumberIsZero(dn) (*(dn)->lsu==0 \ 188188605Srrs && (dn)->digits==1 \ 189188605Srrs && (((dn)->bits&DECSPECIAL)==0)) 190188605Srrs#define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0) 191188605Srrs#define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0) 192188605Srrs#define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0) 193188605Srrs 194188605Srrs#endif 195188605Srrs