172ac97cdSTom Musta /* Decimal number arithmetic module header for the decNumber C Library. 272ac97cdSTom Musta Copyright (C) 2005, 2007 Free Software Foundation, Inc. 372ac97cdSTom Musta Contributed by IBM Corporation. Author Mike Cowlishaw. 472ac97cdSTom Musta 572ac97cdSTom Musta This file is part of GCC. 672ac97cdSTom Musta 772ac97cdSTom Musta GCC is free software; you can redistribute it and/or modify it under 872ac97cdSTom Musta the terms of the GNU General Public License as published by the Free 972ac97cdSTom Musta Software Foundation; either version 2, or (at your option) any later 1072ac97cdSTom Musta version. 1172ac97cdSTom Musta 1272ac97cdSTom Musta In addition to the permissions in the GNU General Public License, 1372ac97cdSTom Musta the Free Software Foundation gives you unlimited permission to link 1472ac97cdSTom Musta the compiled version of this file into combinations with other 1572ac97cdSTom Musta programs, and to distribute those combinations without any 1672ac97cdSTom Musta restriction coming from the use of this file. (The General Public 1772ac97cdSTom Musta License restrictions do apply in other respects; for example, they 1872ac97cdSTom Musta cover modification of the file, and distribution when not linked 1972ac97cdSTom Musta into a combine executable.) 2072ac97cdSTom Musta 2172ac97cdSTom Musta GCC is distributed in the hope that it will be useful, but WITHOUT ANY 2272ac97cdSTom Musta WARRANTY; without even the implied warranty of MERCHANTABILITY or 2372ac97cdSTom Musta FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2472ac97cdSTom Musta for more details. 2572ac97cdSTom Musta 2672ac97cdSTom Musta You should have received a copy of the GNU General Public License 2772ac97cdSTom Musta along with GCC; see the file COPYING. If not, write to the Free 2872ac97cdSTom Musta Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 2972ac97cdSTom Musta 02110-1301, USA. */ 3072ac97cdSTom Musta 3172ac97cdSTom Musta /* ------------------------------------------------------------------ */ 3272ac97cdSTom Musta /* Decimal Number arithmetic module header */ 3372ac97cdSTom Musta /* ------------------------------------------------------------------ */ 3472ac97cdSTom Musta 352a6a4076SMarkus Armbruster #ifndef DECNUMBER_H 362a6a4076SMarkus Armbruster #define DECNUMBER_H 372a6a4076SMarkus Armbruster 3872ac97cdSTom Musta #define DECNAME "decNumber" /* Short name */ 3972ac97cdSTom Musta #define DECFULLNAME "Decimal Number Module" /* Verbose name */ 4072ac97cdSTom Musta #define DECAUTHOR "Mike Cowlishaw" /* Who to blame */ 4172ac97cdSTom Musta 420f2d3732STom Musta #include "libdecnumber/decContext.h" 4372ac97cdSTom Musta 4472ac97cdSTom Musta /* Bit settings for decNumber.bits */ 4572ac97cdSTom Musta #define DECNEG 0x80 /* Sign; 1=negative, 0=positive or zero */ 4672ac97cdSTom Musta #define DECINF 0x40 /* 1=Infinity */ 4772ac97cdSTom Musta #define DECNAN 0x20 /* 1=NaN */ 4872ac97cdSTom Musta #define DECSNAN 0x10 /* 1=sNaN */ 4972ac97cdSTom Musta /* The remaining bits are reserved; they must be 0 */ 5072ac97cdSTom Musta #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value */ 5172ac97cdSTom Musta 5272ac97cdSTom Musta /* Define the decNumber data structure. The size and shape of the */ 5372ac97cdSTom Musta /* units array in the structure is determined by the following */ 5472ac97cdSTom Musta /* constant. This must not be changed without recompiling the */ 5572ac97cdSTom Musta /* decNumber library modules. */ 5672ac97cdSTom Musta 5772ac97cdSTom Musta #define DECDPUN 3 /* DECimal Digits Per UNit [must be >0 */ 5872ac97cdSTom Musta /* and <10; 3 or powers of 2 are best]. */ 5972ac97cdSTom Musta 6072ac97cdSTom Musta /* DECNUMDIGITS is the default number of digits that can be held in */ 6172ac97cdSTom Musta /* the structure. If undefined, 1 is assumed and it is assumed */ 6272ac97cdSTom Musta /* that the structure will be immediately followed by extra space, */ 6372ac97cdSTom Musta /* as required. DECNUMDIGITS is always >0. */ 6472ac97cdSTom Musta #if !defined(DECNUMDIGITS) 6572ac97cdSTom Musta #define DECNUMDIGITS 1 6672ac97cdSTom Musta #endif 6772ac97cdSTom Musta 6872ac97cdSTom Musta /* The size (integer data type) of each unit is determined by the */ 6972ac97cdSTom Musta /* number of digits it will hold. */ 7072ac97cdSTom Musta #if DECDPUN<=2 7172ac97cdSTom Musta #define decNumberUnit uint8_t 7272ac97cdSTom Musta #elif DECDPUN<=4 7372ac97cdSTom Musta #define decNumberUnit uint16_t 7472ac97cdSTom Musta #else 7572ac97cdSTom Musta #define decNumberUnit uint32_t 7672ac97cdSTom Musta #endif 7772ac97cdSTom Musta /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */ 7872ac97cdSTom Musta #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN) 7972ac97cdSTom Musta 8072ac97cdSTom Musta /* The data structure... */ 8172ac97cdSTom Musta typedef struct { 8272ac97cdSTom Musta int32_t digits; /* Count of digits in the coefficient; >0 */ 8372ac97cdSTom Musta int32_t exponent; /* Unadjusted exponent, unbiased, in */ 8472ac97cdSTom Musta /* range: -1999999997 through 999999999 */ 8572ac97cdSTom Musta uint8_t bits; /* Indicator bits (see above) */ 8672ac97cdSTom Musta /* Coefficient, from least significant unit */ 8772ac97cdSTom Musta decNumberUnit lsu[DECNUMUNITS]; 8872ac97cdSTom Musta } decNumber; 8972ac97cdSTom Musta 9072ac97cdSTom Musta /* Notes: */ 9172ac97cdSTom Musta /* 1. If digits is > DECDPUN then there will one or more */ 9272ac97cdSTom Musta /* decNumberUnits immediately following the first element of lsu.*/ 9372ac97cdSTom Musta /* These contain the remaining (more significant) digits of the */ 9472ac97cdSTom Musta /* number, and may be in the lsu array, or may be guaranteed by */ 9572ac97cdSTom Musta /* some other mechanism (such as being contained in another */ 9672ac97cdSTom Musta /* structure, or being overlaid on dynamically allocated */ 9772ac97cdSTom Musta /* storage). */ 9872ac97cdSTom Musta /* */ 9972ac97cdSTom Musta /* Each integer of the coefficient (except potentially the last) */ 10072ac97cdSTom Musta /* contains DECDPUN digits (e.g., a value in the range 0 through */ 10172ac97cdSTom Musta /* 99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3). */ 10272ac97cdSTom Musta /* */ 10372ac97cdSTom Musta /* 2. A decNumber converted to a string may need up to digits+14 */ 10472ac97cdSTom Musta /* characters. The worst cases (non-exponential and exponential */ 10572ac97cdSTom Musta /* formats) are -0.00000{9...}# and -9.{9...}E+999999999# */ 10672ac97cdSTom Musta /* (where # is '\0') */ 10772ac97cdSTom Musta 10872ac97cdSTom Musta 10972ac97cdSTom Musta /* ---------------------------------------------------------------- */ 11072ac97cdSTom Musta /* decNumber public functions and macros */ 11172ac97cdSTom Musta /* ---------------------------------------------------------------- */ 11272ac97cdSTom Musta 11372ac97cdSTom Musta 11472ac97cdSTom Musta /* Conversions */ 11572ac97cdSTom Musta decNumber * decNumberFromInt32(decNumber *, int32_t); 11672ac97cdSTom Musta decNumber * decNumberFromUInt32(decNumber *, uint32_t); 1178e706db2STom Musta decNumber *decNumberFromInt64(decNumber *, int64_t); 1188e706db2STom Musta decNumber *decNumberFromUInt64(decNumber *, uint64_t); 119727385c4SLuis Pires decNumber *decNumberFromInt128(decNumber *, uint64_t, int64_t); 120727385c4SLuis Pires decNumber *decNumberFromUInt128(decNumber *, uint64_t, uint64_t); 12172ac97cdSTom Musta decNumber * decNumberFromString(decNumber *, const char *, decContext *); 12272ac97cdSTom Musta char * decNumberToString(const decNumber *, char *); 12372ac97cdSTom Musta char * decNumberToEngString(const decNumber *, char *); 12472ac97cdSTom Musta uint32_t decNumberToUInt32(const decNumber *, decContext *); 12572ac97cdSTom Musta int32_t decNumberToInt32(const decNumber *, decContext *); 12679af3572STom Musta int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set); 127*21d7826fSLuis Pires void decNumberIntegralToInt128(const decNumber *dn, decContext *set, 128*21d7826fSLuis Pires uint64_t *plow, uint64_t *phigh); 12972ac97cdSTom Musta uint8_t * decNumberGetBCD(const decNumber *, uint8_t *); 13072ac97cdSTom Musta decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t); 13172ac97cdSTom Musta 13272ac97cdSTom Musta /* Operators and elementary functions */ 13372ac97cdSTom Musta decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *); 13472ac97cdSTom Musta decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *); 13572ac97cdSTom Musta decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *); 13672ac97cdSTom Musta decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *); 13772ac97cdSTom Musta decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *); 13872ac97cdSTom Musta decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *); 13972ac97cdSTom Musta decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *); 14072ac97cdSTom Musta decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *); 14172ac97cdSTom Musta decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *); 14272ac97cdSTom Musta decNumber * decNumberExp(decNumber *, const decNumber *, decContext *); 14372ac97cdSTom Musta decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *); 14472ac97cdSTom Musta decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *); 14572ac97cdSTom Musta decNumber * decNumberLn(decNumber *, const decNumber *, decContext *); 14672ac97cdSTom Musta decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *); 14772ac97cdSTom Musta decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *); 14872ac97cdSTom Musta decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *); 14972ac97cdSTom Musta decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *); 15072ac97cdSTom Musta decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *); 15172ac97cdSTom Musta decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *); 15272ac97cdSTom Musta decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *); 15372ac97cdSTom Musta decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *); 15472ac97cdSTom Musta decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *); 15572ac97cdSTom Musta decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *); 15672ac97cdSTom Musta decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *); 15772ac97cdSTom Musta decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *); 15872ac97cdSTom Musta decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *); 15972ac97cdSTom Musta decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *); 16072ac97cdSTom Musta decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *); 16172ac97cdSTom Musta decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *); 16272ac97cdSTom Musta decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *); 16372ac97cdSTom Musta decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *); 16472ac97cdSTom Musta decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *); 16572ac97cdSTom Musta decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *); 16672ac97cdSTom Musta decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *); 16772ac97cdSTom Musta decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *); 16872ac97cdSTom Musta decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *); 16972ac97cdSTom Musta decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *); 17072ac97cdSTom Musta decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *); 17172ac97cdSTom Musta decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *); 17272ac97cdSTom Musta 17372ac97cdSTom Musta /* Utilities */ 17472ac97cdSTom Musta enum decClass decNumberClass(const decNumber *, decContext *); 17572ac97cdSTom Musta const char * decNumberClassToString(enum decClass); 17672ac97cdSTom Musta decNumber * decNumberCopy(decNumber *, const decNumber *); 17772ac97cdSTom Musta decNumber * decNumberCopyAbs(decNumber *, const decNumber *); 17872ac97cdSTom Musta decNumber * decNumberCopyNegate(decNumber *, const decNumber *); 17972ac97cdSTom Musta decNumber * decNumberCopySign(decNumber *, const decNumber *, const decNumber *); 18072ac97cdSTom Musta decNumber * decNumberNextMinus(decNumber *, const decNumber *, decContext *); 18172ac97cdSTom Musta decNumber * decNumberNextPlus(decNumber *, const decNumber *, decContext *); 18272ac97cdSTom Musta decNumber * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *); 18372ac97cdSTom Musta decNumber * decNumberTrim(decNumber *); 18472ac97cdSTom Musta const char * decNumberVersion(void); 18572ac97cdSTom Musta decNumber * decNumberZero(decNumber *); 18672ac97cdSTom Musta 18772ac97cdSTom Musta /* Functions for testing decNumbers (normality depends on context) */ 18872ac97cdSTom Musta int32_t decNumberIsNormal(const decNumber *, decContext *); 18972ac97cdSTom Musta int32_t decNumberIsSubnormal(const decNumber *, decContext *); 19072ac97cdSTom Musta 19172ac97cdSTom Musta /* Macros for testing decNumber *dn */ 19272ac97cdSTom Musta #define decNumberIsCanonical(dn) (1) /* All decNumbers are saintly */ 19372ac97cdSTom Musta #define decNumberIsFinite(dn) (((dn)->bits&DECSPECIAL)==0) 19472ac97cdSTom Musta #define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0) 19572ac97cdSTom Musta #define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0) 19672ac97cdSTom Musta #define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0) 19772ac97cdSTom Musta #define decNumberIsQNaN(dn) (((dn)->bits&(DECNAN))!=0) 19872ac97cdSTom Musta #define decNumberIsSNaN(dn) (((dn)->bits&(DECSNAN))!=0) 19972ac97cdSTom Musta #define decNumberIsSpecial(dn) (((dn)->bits&DECSPECIAL)!=0) 20072ac97cdSTom Musta #define decNumberIsZero(dn) (*(dn)->lsu==0 \ 20172ac97cdSTom Musta && (dn)->digits==1 \ 20272ac97cdSTom Musta && (((dn)->bits&DECSPECIAL)==0)) 20372ac97cdSTom Musta #define decNumberRadix(dn) (10) 20472ac97cdSTom Musta 20572ac97cdSTom Musta #endif 206