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 3572ac97cdSTom Musta #if !defined(DECNUMBER) 3672ac97cdSTom Musta #define DECNUMBER 3772ac97cdSTom Musta #define DECNAME "decNumber" /* Short name */ 3872ac97cdSTom Musta #define DECFULLNAME "Decimal Number Module" /* Verbose name */ 3972ac97cdSTom Musta #define DECAUTHOR "Mike Cowlishaw" /* Who to blame */ 4072ac97cdSTom Musta 4172ac97cdSTom Musta #if !defined(DECCONTEXT) 420f2d3732STom Musta #include "libdecnumber/decContext.h" 4372ac97cdSTom Musta #endif 4472ac97cdSTom Musta 4572ac97cdSTom Musta /* Bit settings for decNumber.bits */ 4672ac97cdSTom Musta #define DECNEG 0x80 /* Sign; 1=negative, 0=positive or zero */ 4772ac97cdSTom Musta #define DECINF 0x40 /* 1=Infinity */ 4872ac97cdSTom Musta #define DECNAN 0x20 /* 1=NaN */ 4972ac97cdSTom Musta #define DECSNAN 0x10 /* 1=sNaN */ 5072ac97cdSTom Musta /* The remaining bits are reserved; they must be 0 */ 5172ac97cdSTom Musta #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value */ 5272ac97cdSTom Musta 5372ac97cdSTom Musta /* Define the decNumber data structure. The size and shape of the */ 5472ac97cdSTom Musta /* units array in the structure is determined by the following */ 5572ac97cdSTom Musta /* constant. This must not be changed without recompiling the */ 5672ac97cdSTom Musta /* decNumber library modules. */ 5772ac97cdSTom Musta 5872ac97cdSTom Musta #define DECDPUN 3 /* DECimal Digits Per UNit [must be >0 */ 5972ac97cdSTom Musta /* and <10; 3 or powers of 2 are best]. */ 6072ac97cdSTom Musta 6172ac97cdSTom Musta /* DECNUMDIGITS is the default number of digits that can be held in */ 6272ac97cdSTom Musta /* the structure. If undefined, 1 is assumed and it is assumed */ 6372ac97cdSTom Musta /* that the structure will be immediately followed by extra space, */ 6472ac97cdSTom Musta /* as required. DECNUMDIGITS is always >0. */ 6572ac97cdSTom Musta #if !defined(DECNUMDIGITS) 6672ac97cdSTom Musta #define DECNUMDIGITS 1 6772ac97cdSTom Musta #endif 6872ac97cdSTom Musta 6972ac97cdSTom Musta /* The size (integer data type) of each unit is determined by the */ 7072ac97cdSTom Musta /* number of digits it will hold. */ 7172ac97cdSTom Musta #if DECDPUN<=2 7272ac97cdSTom Musta #define decNumberUnit uint8_t 7372ac97cdSTom Musta #elif DECDPUN<=4 7472ac97cdSTom Musta #define decNumberUnit uint16_t 7572ac97cdSTom Musta #else 7672ac97cdSTom Musta #define decNumberUnit uint32_t 7772ac97cdSTom Musta #endif 7872ac97cdSTom Musta /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */ 7972ac97cdSTom Musta #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN) 8072ac97cdSTom Musta 8172ac97cdSTom Musta /* The data structure... */ 8272ac97cdSTom Musta typedef struct { 8372ac97cdSTom Musta int32_t digits; /* Count of digits in the coefficient; >0 */ 8472ac97cdSTom Musta int32_t exponent; /* Unadjusted exponent, unbiased, in */ 8572ac97cdSTom Musta /* range: -1999999997 through 999999999 */ 8672ac97cdSTom Musta uint8_t bits; /* Indicator bits (see above) */ 8772ac97cdSTom Musta /* Coefficient, from least significant unit */ 8872ac97cdSTom Musta decNumberUnit lsu[DECNUMUNITS]; 8972ac97cdSTom Musta } decNumber; 9072ac97cdSTom Musta 9172ac97cdSTom Musta /* Notes: */ 9272ac97cdSTom Musta /* 1. If digits is > DECDPUN then there will one or more */ 9372ac97cdSTom Musta /* decNumberUnits immediately following the first element of lsu.*/ 9472ac97cdSTom Musta /* These contain the remaining (more significant) digits of the */ 9572ac97cdSTom Musta /* number, and may be in the lsu array, or may be guaranteed by */ 9672ac97cdSTom Musta /* some other mechanism (such as being contained in another */ 9772ac97cdSTom Musta /* structure, or being overlaid on dynamically allocated */ 9872ac97cdSTom Musta /* storage). */ 9972ac97cdSTom Musta /* */ 10072ac97cdSTom Musta /* Each integer of the coefficient (except potentially the last) */ 10172ac97cdSTom Musta /* contains DECDPUN digits (e.g., a value in the range 0 through */ 10272ac97cdSTom Musta /* 99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3). */ 10372ac97cdSTom Musta /* */ 10472ac97cdSTom Musta /* 2. A decNumber converted to a string may need up to digits+14 */ 10572ac97cdSTom Musta /* characters. The worst cases (non-exponential and exponential */ 10672ac97cdSTom Musta /* formats) are -0.00000{9...}# and -9.{9...}E+999999999# */ 10772ac97cdSTom Musta /* (where # is '\0') */ 10872ac97cdSTom Musta 10972ac97cdSTom Musta 11072ac97cdSTom Musta /* ---------------------------------------------------------------- */ 11172ac97cdSTom Musta /* decNumber public functions and macros */ 11272ac97cdSTom Musta /* ---------------------------------------------------------------- */ 11372ac97cdSTom Musta 11472ac97cdSTom Musta 11572ac97cdSTom Musta /* Conversions */ 11672ac97cdSTom Musta decNumber * decNumberFromInt32(decNumber *, int32_t); 11772ac97cdSTom Musta decNumber * decNumberFromUInt32(decNumber *, uint32_t); 1188e706db2STom Musta decNumber *decNumberFromInt64(decNumber *, int64_t); 1198e706db2STom Musta decNumber *decNumberFromUInt64(decNumber *, uint64_t); 12072ac97cdSTom Musta decNumber * decNumberFromString(decNumber *, const char *, decContext *); 12172ac97cdSTom Musta char * decNumberToString(const decNumber *, char *); 12272ac97cdSTom Musta char * decNumberToEngString(const decNumber *, char *); 12372ac97cdSTom Musta uint32_t decNumberToUInt32(const decNumber *, decContext *); 12472ac97cdSTom Musta int32_t decNumberToInt32(const decNumber *, decContext *); 125*79af3572STom Musta int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set); 12672ac97cdSTom Musta uint8_t * decNumberGetBCD(const decNumber *, uint8_t *); 12772ac97cdSTom Musta decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t); 12872ac97cdSTom Musta 12972ac97cdSTom Musta /* Operators and elementary functions */ 13072ac97cdSTom Musta decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *); 13172ac97cdSTom Musta decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *); 13272ac97cdSTom Musta decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *); 13372ac97cdSTom Musta decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *); 13472ac97cdSTom Musta decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *); 13572ac97cdSTom Musta decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *); 13672ac97cdSTom Musta decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *); 13772ac97cdSTom Musta decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *); 13872ac97cdSTom Musta decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *); 13972ac97cdSTom Musta decNumber * decNumberExp(decNumber *, const decNumber *, decContext *); 14072ac97cdSTom Musta decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *); 14172ac97cdSTom Musta decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *); 14272ac97cdSTom Musta decNumber * decNumberLn(decNumber *, const decNumber *, decContext *); 14372ac97cdSTom Musta decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *); 14472ac97cdSTom Musta decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *); 14572ac97cdSTom Musta decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *); 14672ac97cdSTom Musta decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *); 14772ac97cdSTom Musta decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *); 14872ac97cdSTom Musta decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *); 14972ac97cdSTom Musta decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *); 15072ac97cdSTom Musta decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *); 15172ac97cdSTom Musta decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *); 15272ac97cdSTom Musta decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *); 15372ac97cdSTom Musta decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *); 15472ac97cdSTom Musta decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *); 15572ac97cdSTom Musta decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *); 15672ac97cdSTom Musta decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *); 15772ac97cdSTom Musta decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *); 15872ac97cdSTom Musta decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *); 15972ac97cdSTom Musta decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *); 16072ac97cdSTom Musta decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *); 16172ac97cdSTom Musta decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *); 16272ac97cdSTom Musta decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *); 16372ac97cdSTom Musta decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *); 16472ac97cdSTom Musta decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *); 16572ac97cdSTom Musta decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *); 16672ac97cdSTom Musta decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *); 16772ac97cdSTom Musta decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *); 16872ac97cdSTom Musta decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *); 16972ac97cdSTom Musta 17072ac97cdSTom Musta /* Utilities */ 17172ac97cdSTom Musta enum decClass decNumberClass(const decNumber *, decContext *); 17272ac97cdSTom Musta const char * decNumberClassToString(enum decClass); 17372ac97cdSTom Musta decNumber * decNumberCopy(decNumber *, const decNumber *); 17472ac97cdSTom Musta decNumber * decNumberCopyAbs(decNumber *, const decNumber *); 17572ac97cdSTom Musta decNumber * decNumberCopyNegate(decNumber *, const decNumber *); 17672ac97cdSTom Musta decNumber * decNumberCopySign(decNumber *, const decNumber *, const decNumber *); 17772ac97cdSTom Musta decNumber * decNumberNextMinus(decNumber *, const decNumber *, decContext *); 17872ac97cdSTom Musta decNumber * decNumberNextPlus(decNumber *, const decNumber *, decContext *); 17972ac97cdSTom Musta decNumber * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *); 18072ac97cdSTom Musta decNumber * decNumberTrim(decNumber *); 18172ac97cdSTom Musta const char * decNumberVersion(void); 18272ac97cdSTom Musta decNumber * decNumberZero(decNumber *); 18372ac97cdSTom Musta 18472ac97cdSTom Musta /* Functions for testing decNumbers (normality depends on context) */ 18572ac97cdSTom Musta int32_t decNumberIsNormal(const decNumber *, decContext *); 18672ac97cdSTom Musta int32_t decNumberIsSubnormal(const decNumber *, decContext *); 18772ac97cdSTom Musta 18872ac97cdSTom Musta /* Macros for testing decNumber *dn */ 18972ac97cdSTom Musta #define decNumberIsCanonical(dn) (1) /* All decNumbers are saintly */ 19072ac97cdSTom Musta #define decNumberIsFinite(dn) (((dn)->bits&DECSPECIAL)==0) 19172ac97cdSTom Musta #define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0) 19272ac97cdSTom Musta #define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0) 19372ac97cdSTom Musta #define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0) 19472ac97cdSTom Musta #define decNumberIsQNaN(dn) (((dn)->bits&(DECNAN))!=0) 19572ac97cdSTom Musta #define decNumberIsSNaN(dn) (((dn)->bits&(DECSNAN))!=0) 19672ac97cdSTom Musta #define decNumberIsSpecial(dn) (((dn)->bits&DECSPECIAL)!=0) 19772ac97cdSTom Musta #define decNumberIsZero(dn) (*(dn)->lsu==0 \ 19872ac97cdSTom Musta && (dn)->digits==1 \ 19972ac97cdSTom Musta && (((dn)->bits&DECSPECIAL)==0)) 20072ac97cdSTom Musta #define decNumberRadix(dn) (10) 20172ac97cdSTom Musta 20272ac97cdSTom Musta #endif 203