1 1.1 christos /* Decimal number arithmetic module header for the decNumber C Library. 2 1.1.1.3 christos Copyright (C) 2005-2018 Free Software Foundation, Inc. 3 1.1 christos Contributed by IBM Corporation. Author Mike Cowlishaw. 4 1.1 christos 5 1.1 christos This file is part of GCC. 6 1.1 christos 7 1.1 christos GCC is free software; you can redistribute it and/or modify it under 8 1.1 christos the terms of the GNU General Public License as published by the Free 9 1.1 christos Software Foundation; either version 3, or (at your option) any later 10 1.1 christos version. 11 1.1 christos 12 1.1 christos GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 1.1 christos WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 1.1 christos FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 1.1 christos for more details. 16 1.1 christos 17 1.1 christos Under Section 7 of GPL version 3, you are granted additional 18 1.1 christos permissions described in the GCC Runtime Library Exception, version 19 1.1 christos 3.1, as published by the Free Software Foundation. 20 1.1 christos 21 1.1 christos You should have received a copy of the GNU General Public License and 22 1.1 christos a copy of the GCC Runtime Library Exception along with this program; 23 1.1 christos see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 1.1 christos <http://www.gnu.org/licenses/>. */ 25 1.1 christos 26 1.1 christos /* ------------------------------------------------------------------ */ 27 1.1 christos /* Decimal Number arithmetic module header */ 28 1.1 christos /* ------------------------------------------------------------------ */ 29 1.1 christos 30 1.1 christos #if !defined(DECNUMBER) 31 1.1 christos #define DECNUMBER 32 1.1 christos #define DECNAME "decNumber" /* Short name */ 33 1.1 christos #define DECFULLNAME "Decimal Number Module" /* Verbose name */ 34 1.1 christos #define DECAUTHOR "Mike Cowlishaw" /* Who to blame */ 35 1.1 christos 36 1.1 christos #if !defined(DECCONTEXT) 37 1.1 christos #include "decContext.h" 38 1.1 christos #endif 39 1.1 christos 40 1.1 christos /* Bit settings for decNumber.bits */ 41 1.1 christos #define DECNEG 0x80 /* Sign; 1=negative, 0=positive or zero */ 42 1.1 christos #define DECINF 0x40 /* 1=Infinity */ 43 1.1 christos #define DECNAN 0x20 /* 1=NaN */ 44 1.1 christos #define DECSNAN 0x10 /* 1=sNaN */ 45 1.1 christos /* The remaining bits are reserved; they must be 0 */ 46 1.1 christos #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value */ 47 1.1 christos 48 1.1 christos /* Define the decNumber data structure. The size and shape of the */ 49 1.1 christos /* units array in the structure is determined by the following */ 50 1.1 christos /* constant. This must not be changed without recompiling the */ 51 1.1 christos /* decNumber library modules. */ 52 1.1 christos 53 1.1 christos #define DECDPUN 3 /* DECimal Digits Per UNit [must be >0 */ 54 1.1 christos /* and <10; 3 or powers of 2 are best]. */ 55 1.1 christos 56 1.1 christos /* DECNUMDIGITS is the default number of digits that can be held in */ 57 1.1 christos /* the structure. If undefined, 1 is assumed and it is assumed */ 58 1.1 christos /* that the structure will be immediately followed by extra space, */ 59 1.1 christos /* as required. DECNUMDIGITS is always >0. */ 60 1.1 christos #if !defined(DECNUMDIGITS) 61 1.1 christos #define DECNUMDIGITS 1 62 1.1 christos #endif 63 1.1 christos 64 1.1 christos /* The size (integer data type) of each unit is determined by the */ 65 1.1 christos /* number of digits it will hold. */ 66 1.1 christos #if DECDPUN<=2 67 1.1 christos #define decNumberUnit uint8_t 68 1.1 christos #elif DECDPUN<=4 69 1.1 christos #define decNumberUnit uint16_t 70 1.1 christos #else 71 1.1 christos #define decNumberUnit uint32_t 72 1.1 christos #endif 73 1.1 christos /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */ 74 1.1 christos #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN) 75 1.1 christos 76 1.1 christos /* The data structure... */ 77 1.1 christos typedef struct { 78 1.1 christos int32_t digits; /* Count of digits in the coefficient; >0 */ 79 1.1 christos int32_t exponent; /* Unadjusted exponent, unbiased, in */ 80 1.1 christos /* range: -1999999997 through 999999999 */ 81 1.1 christos uint8_t bits; /* Indicator bits (see above) */ 82 1.1 christos /* Coefficient, from least significant unit */ 83 1.1 christos decNumberUnit lsu[DECNUMUNITS]; 84 1.1 christos } decNumber; 85 1.1 christos 86 1.1 christos /* Notes: */ 87 1.1 christos /* 1. If digits is > DECDPUN then there will one or more */ 88 1.1 christos /* decNumberUnits immediately following the first element of lsu.*/ 89 1.1 christos /* These contain the remaining (more significant) digits of the */ 90 1.1 christos /* number, and may be in the lsu array, or may be guaranteed by */ 91 1.1 christos /* some other mechanism (such as being contained in another */ 92 1.1 christos /* structure, or being overlaid on dynamically allocated */ 93 1.1 christos /* storage). */ 94 1.1 christos /* */ 95 1.1 christos /* Each integer of the coefficient (except potentially the last) */ 96 1.1 christos /* contains DECDPUN digits (e.g., a value in the range 0 through */ 97 1.1 christos /* 99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3). */ 98 1.1 christos /* */ 99 1.1 christos /* 2. A decNumber converted to a string may need up to digits+14 */ 100 1.1 christos /* characters. The worst cases (non-exponential and exponential */ 101 1.1 christos /* formats) are -0.00000{9...}# and -9.{9...}E+999999999# */ 102 1.1 christos /* (where # is '\0') */ 103 1.1 christos 104 1.1 christos 105 1.1 christos /* ---------------------------------------------------------------- */ 106 1.1 christos /* decNumber public functions and macros */ 107 1.1 christos /* ---------------------------------------------------------------- */ 108 1.1 christos 109 1.1 christos #include "decNumberSymbols.h" 110 1.1 christos 111 1.1 christos #ifdef __cplusplus 112 1.1 christos extern "C" { 113 1.1 christos #endif 114 1.1 christos 115 1.1 christos /* Conversions */ 116 1.1 christos decNumber * decNumberFromInt32(decNumber *, int32_t); 117 1.1 christos decNumber * decNumberFromUInt32(decNumber *, uint32_t); 118 1.1 christos decNumber * decNumberFromString(decNumber *, const char *, decContext *); 119 1.1 christos char * decNumberToString(const decNumber *, char *); 120 1.1 christos char * decNumberToEngString(const decNumber *, char *); 121 1.1 christos uint32_t decNumberToUInt32(const decNumber *, decContext *); 122 1.1 christos int32_t decNumberToInt32(const decNumber *, decContext *); 123 1.1 christos uint8_t * decNumberGetBCD(const decNumber *, uint8_t *); 124 1.1 christos decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t); 125 1.1 christos 126 1.1 christos /* Operators and elementary functions */ 127 1.1 christos decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *); 128 1.1 christos decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *); 129 1.1 christos decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *); 130 1.1 christos decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *); 131 1.1 christos decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *); 132 1.1 christos decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *); 133 1.1 christos decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *); 134 1.1 christos decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *); 135 1.1 christos decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *); 136 1.1 christos decNumber * decNumberExp(decNumber *, const decNumber *, decContext *); 137 1.1 christos decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *); 138 1.1 christos decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *); 139 1.1 christos decNumber * decNumberLn(decNumber *, const decNumber *, decContext *); 140 1.1 christos decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *); 141 1.1 christos decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *); 142 1.1 christos decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *); 143 1.1 christos decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *); 144 1.1 christos decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *); 145 1.1 christos decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *); 146 1.1 christos decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *); 147 1.1 christos decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *); 148 1.1 christos decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *); 149 1.1 christos decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *); 150 1.1 christos decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *); 151 1.1 christos decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *); 152 1.1 christos decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *); 153 1.1 christos decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *); 154 1.1 christos decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *); 155 1.1 christos decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *); 156 1.1 christos decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *); 157 1.1 christos decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *); 158 1.1 christos decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *); 159 1.1 christos decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *); 160 1.1 christos decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *); 161 1.1 christos decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *); 162 1.1 christos decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *); 163 1.1 christos decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *); 164 1.1 christos decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *); 165 1.1 christos decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *); 166 1.1 christos 167 1.1 christos /* Utilities */ 168 1.1 christos enum decClass decNumberClass(const decNumber *, decContext *); 169 1.1 christos const char * decNumberClassToString(enum decClass); 170 1.1 christos decNumber * decNumberCopy(decNumber *, const decNumber *); 171 1.1 christos decNumber * decNumberCopyAbs(decNumber *, const decNumber *); 172 1.1 christos decNumber * decNumberCopyNegate(decNumber *, const decNumber *); 173 1.1 christos decNumber * decNumberCopySign(decNumber *, const decNumber *, const decNumber *); 174 1.1 christos decNumber * decNumberNextMinus(decNumber *, const decNumber *, decContext *); 175 1.1 christos decNumber * decNumberNextPlus(decNumber *, const decNumber *, decContext *); 176 1.1 christos decNumber * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *); 177 1.1 christos decNumber * decNumberTrim(decNumber *); 178 1.1 christos const char * decNumberVersion(void); 179 1.1 christos decNumber * decNumberZero(decNumber *); 180 1.1 christos 181 1.1 christos /* Functions for testing decNumbers (normality depends on context) */ 182 1.1 christos int32_t decNumberIsNormal(const decNumber *, decContext *); 183 1.1 christos int32_t decNumberIsSubnormal(const decNumber *, decContext *); 184 1.1 christos 185 1.1 christos /* Macros for testing decNumber *dn */ 186 1.1 christos #define decNumberIsCanonical(dn) (1) /* All decNumbers are saintly */ 187 1.1 christos #define decNumberIsFinite(dn) (((dn)->bits&DECSPECIAL)==0) 188 1.1 christos #define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0) 189 1.1 christos #define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0) 190 1.1 christos #define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0) 191 1.1 christos #define decNumberIsQNaN(dn) (((dn)->bits&(DECNAN))!=0) 192 1.1 christos #define decNumberIsSNaN(dn) (((dn)->bits&(DECSNAN))!=0) 193 1.1 christos #define decNumberIsSpecial(dn) (((dn)->bits&DECSPECIAL)!=0) 194 1.1 christos #define decNumberIsZero(dn) (*(dn)->lsu==0 \ 195 1.1 christos && (dn)->digits==1 \ 196 1.1 christos && (((dn)->bits&DECSPECIAL)==0)) 197 1.1 christos #define decNumberRadix(dn) (10) 198 1.1 christos 199 1.1 christos #ifdef __cplusplus 200 1.1 christos } 201 1.1 christos #endif 202 1.1 christos 203 1.1 christos #endif 204